发表于: 2017-11-22 21:21:23

0 639


【今日完成】

今天讲了一波小课堂:

关于Shiro


Shiro的简单运用

           1.背景介绍

            先介绍下背景

Shiro是什么?

Apache Shiro(读作“sheeroh”,即日语“城”)是一个开源安全框架,提供身份验证、授权、密码和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。

    城:じょう、しろ

Shiro的产生背景:Shiro的前身是JSecurity。

2004年,Les Hazlewood和Jeremy Haile创办了Jsecurity。当时他们找不到适用于应用程序级别的合适Java安全框架,同时又对JAAS非常失望。2010年9月22日,Shrio成为Apache软件基金会的顶级项目(TLP)。

Java认证和授权服务(Java Authentication and Authorization Service,简称JAAS)是一个Java以用户为中心的安全框架,作为Java以代码为中心的安全的补充。自Java运行环境(JRE) 1.4起,JAAS就被集成到JRE,而之前是作为一个扩展库由Sun公司提供的。

            2.知识剖析

Shiro的几个术语

Subject

SecurityManager

Relam

Role&Permission

Subject

          Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;即一个抽象概念;所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者;


SecurityManager

安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject;可以看出它是Shiro的核心,它负责与后边介绍的其他组件进行交互,如果学习过SpringMVC,你可以把它看成DispatcherServlet前端控制器;


Relam

Realm:域,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。

 

Role&Permission

角色与权限:一个角色可以对应多个权限。Shiro验证有两种方式。


3.常见问题

 ①、使用Shiro的好处是什么?

②、如何使用Shiro?



4.解决方案


 ①、Shiro可以使项目的验证架构更加完善,扩展性强

 ②、别说话,看我操作

5.编码实战

6.扩展思考

SpringSecurity,是Spring框架的一个分支,主要也是解决验证登录权限问题,可是需要Spring4.1以上的版本,无奈我们项目用的框架只支持低版本3.1.1.Release

用不了啊用不了


然后新写了几个接口

 /**
   * root级别管理员修改自己密码
   * @author Jeff
   * @Date 2017-11-22
   * @param oldPassword
   * @param newPassword
   * @param reNewPassword
   */
  @RequestMapping(value = "a/u/root/password", method = RequestMethod.POST) // @RequestMapping 注解可以用指定的URL路径访问本控制层
  public String rootModify(Model model, HttpServletResponse response, HttpServletRequest request,  String oldPassword,String newPassword, String reNewPassword) {
if (null == oldPassword || null == newPassword||null ==reNewPassword) {
model.addAttribute("code", -200000);
          model.addAttribute("specialmessage", "参数缺失");
          return "data/json";
      }
try {

DesUtil des = new DesUtil("colddew");// 自定义密钥
     Admin root =adminService.getObjectById(1L);
     if (des.encrypt(oldPassword).equals(root.getAdminPassword())){
if (reNewPassword.equals(newPassword)){
root.setAdminPassword(des.encrypt(newPassword));
           adminService.update(root);
        }else {
model.addAttribute("code",-5003);
           return "/data/json";
        }
}else {
model.addAttribute("code",-5002);
        return "/data/json";
     }

} catch (Throwable e) {
e.printStackTrace();
          model.addAttribute("code", -5002);
          return "/data/json";
      }
log.info("root修改自己账户成功");
      model.addAttribute("code", 0);
      return "/data/json";
  }

/**
* root-管理员账户列表(动态查询)
*@param role
*@author Jeff
*@date 2017-11-22 10:41
**/
@RequestMapping(value = "/a/u/root/list", method = RequestMethod.GET)
public String getMultiAdminJson(HttpServletRequest request,
                        HttpServletResponse response, ModelMap model, Integer role,
                       Integer page,Integer size)
throws Exception {

log.info("公告动态查询");
  //1 初始化参数
  if (page == null) {
page = 1;
  }
if (size == null) {
size = 10;
  }
Integer start = (page - 1) * size;
  if (start < 0) {
start = 0;
  }
log.info(size);
  log.info(start);
  try {
// 2 通过参数拿条件
     Map<String, Object> param = DynamicUtil.getAdminByRole(role);
     log.info("文档参数是:" + param);
     //3 通过条件拿Ids
     List<Long> ids = adminService.getIdsByDynamicCondition(Admin.class, param,start,size);
     log.info("the ids is " + ids);
     // 4 通过Ids拿公告列表
     List<Admin> articlesList = adminService.getObjectsByIds(ids);
     log.info("get article data is " + articlesList.size());
     List<Long> totalIds = adminService.getIdsByDynamicCondition(Admin.class, param,0,99999);

     model.addAttribute("total",totalIds.size());
     model.addAttribute("page", page);
     model.addAttribute("size", size);
     model.addAttribute("articlesList", articlesList);
     model.addAttribute("code", 0);

  } catch (Throwable t) {
log.error(t.getMessage());
     log.error("get article error" );
     model.addAttribute("code", -100000);
  }

return "admin/json/adminDetailJson";
}
/**
* root级别--新增管理员
* @author Jeff
* @Date 2017-11-22
* @param adminName
* @param password
* @param role
*/
@RequestMapping(value = "a/u/root/admin", method = RequestMethod.POST) // @RequestMapping 注解可以用指定的URL路径访问本控制层
public String adminAdd(Model model, HttpServletResponse response, HttpServletRequest request,  String adminName,String password, Integer role) {
if (null == adminName || null == password||null ==role) {
model.addAttribute("code", -200000);
     model.addAttribute("specialmessage", "参数缺失");
     return "data/json";
  }
try {

DesUtil des = new DesUtil("colddew");// 自定义密钥
     Admin admin =new Admin();
     admin.setAdminName(adminName);
     admin.setAdminPassword(des.encrypt(password));
     //更新数据库后启用:admin.setRole(role);
     adminService.insert(admin);
  } catch (Throwable e) {
e.printStackTrace();
     model.addAttribute("code", -100000);
     return "/data/json";
  }
log.info("root新增账户成功");
  model.addAttribute("code", 0);
  return "/data/json";
}
/**
* root级别--修改管理员
* @author Jeff
* @Date 2017-11-22
* @param adminName
* @param password
* @param role
* @param adminId
*/
@RequestMapping(value = "a/u/root/admin", method = RequestMethod.PUT) // @RequestMapping 注解可以用指定的URL路径访问本控制层
public String adminModify(Model model, HttpServletResponse response, HttpServletRequest request,Long adminId,String adminName,String password, Integer role) {
if (null == adminName || null == password||null ==role||null ==adminId) {
model.addAttribute("code", -200000);
     model.addAttribute("specialmessage", "参数缺失");
     return "data/json";
  }
try {
DesUtil des = new DesUtil("colddew");// 自定义密钥
     Admin admin =adminService.getObjectById(adminId);
     admin.setAdminName(adminName);
     admin.setAdminPassword(des.encrypt(password));
     //更新数据库后启用:admin.setRole(role);
     adminService.update(admin);
  } catch (Throwable e) {
e.printStackTrace();
     model.addAttribute("code", -100000);
     return "/data/json";
  }
log.info("root修改账户成功");
  model.addAttribute("code", 0);
  return "/data/json";
}
/**
* root级别--删除管理员
* @author Jeff
* @Date 2017-11-22
* @param adminId
*/
@RequestMapping(value = "a/u/root/admin", method = RequestMethod.PUT) // @RequestMapping 注解可以用指定的URL路径访问本控制层
public String adminDelete(Model model, HttpServletResponse response, HttpServletRequest request,Long adminId) {
if (null ==adminId) {
model.addAttribute("code", -200000);
     model.addAttribute("specialmessage", "参数缺失");
     return "data/json";
  }
try {
adminService.delete(adminId);
  } catch (Throwable e) {
e.printStackTrace();
     model.addAttribute("code", -100000);
     return "/data/json";
  }
log.info("root删除账户成功");
  model.addAttribute("code", 0);
  return "/data/json";
}

【今日收获】

对shiro理解更深了,新增了几个接口


【明日计划】

自己测一下,然后部署


返回列表 返回列表
评论

    分享到