博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
权限认证与授权(Shrio 框架)
阅读量:6364 次
发布时间:2019-06-23

本文共 4678 字,大约阅读时间需要 15 分钟。

权限概述

  • 认证: 系统提供的用于识别用户身份的功能, 通常登录功能就是认证功能; -- 让系统知道你是谁
  • 授权: 系统授予用户可以访问哪些功能的证书. -- 让系统知道你能做什么!

常见的权限控制方式

  • URL 拦截权限控制
    • 底层基于拦截器或过滤器实现
  • 方法注解权限控制
    • 我们框架会将加入注解的Action创建代理对象,由代理对象进行权限校验,如果校验通过,通过反射调用目标对象的方
      法,如果校验不通过,框架会抛出权限不足异常;
    • 底层基于代理技术实现,为 Action 创建代理对象,由代理对象进行权限校验;

创建权限数据模型

  • 权限表
  • 角色表(权限的集合), 引入角色表,是为了方便授权
  • 用户表
  • 角色权限关系表
  • 用户角色关系表

apache shiro 框架

  • 核心功能
    • 身份认证(Authentication): 简称"登录";
    • 授权(Authorization):给用户分配角色或者权限资源;
    • 会话管理(Session Management)
    • 加密

shiro 框架认证流程

1222878-20171123081807602-2041499493.png

1222878-20171123081900993-327417161.png

1. 使用shiro框架的URL拦截进行权限控制(基于过滤器技术实现)

1.1 导入jar包: shiro-all;

1.2 在web.xml中配置一个由spring提供的过滤器,用于整合shiro框架(这个过滤器必须放在struts2 过滤器前)

shiroFilter
org.springframework.web.filter.DelegatingFilterProxy
shiroFilter
/*

1222878-20171123124201758-2054438410.png

1.3 在spring配置文件中配置bean,id和上面的过滤器名称一致

/css/** = anon /js/** = anon /images/** = anon /validatecode.jsp* = anon /login.jsp = anon /userAction_login.action = anon /page_base_staff.action = perms["staff-list"] /* = authc

1222878-20171123124227727-406251050.png

1.4 修改 UserAction 中的login方法,使用shiro框架提供的方式进行认证操作

// UserAction.javapublic class UserAction extends BaseAction
{ // 属性驱动,接收页面输入的验证码 private String checkcode; public void setCheckcode(String checkcode){ this.checkcode = checkcode; } // 使用shiro框架提供的方式,进行认证操作 public String login(){ // 从Session中获取生成的验证码 String validatecode = (String)ServletActionContext.getRequest().getSession().getAttribute("key"); //校验验证码是否正确 if(StringUtils.isNotBlank(checkcode) && checkcode.equals(validatecode)){ // 使用shiro框架提供的方式进行认证操作 Subject subject = SecurityUtils.getSubject(); // 获取当前用户对象 // 创建用户名,密码令牌对象 AuthenticationToken token = new UsernamePasswordToken(model.getUsername(), MD5Utils.md5(model.getPassword())); try{ subject.login(token); }catch(Exception e){ e.printStackTrace(); return LOGIN; } // 登录成功,将user从当前线程中取出,放入session中 User user = (User)subject.getPrincipal(); ServletActionContext.getRequest().getSession().setAttribute("loginUser",user); return HOME; }else{ // 输入的验证码错误,设置提示信息,跳转到登录页面 this.addActionError("输入的验证码错误!"); return LOGIN; } }}// 自定义realm类, BOSRealm.javapublic class BOSRealm extends AuthorizingRealm{ @Autowired private IUserDao userDao; // 认证方法 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken passwordToken = (UsernamePasswordToken)token; // 获取页面输入的用户名 String username = passwordToken.getUsername(); // 根据用户名查询数据库中的密码 User user = userDao.findUserByUsername(username); if(user == null){ // 如果页面输入的用户名不存在 return null; } // 创建简单认证对象 AuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getPassword(), this.getName()); // shiro框架负责比对数据库中的密码和页面输入的密码是否一致 return info; } // 授权方法 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // 为用户授权 info.addStringPermission("staff-list"); // 获取当前用户(两种方式) User user1 = (User)SecurityUtils.getSubject().getPrincipal(); User user2 = (User)principals.getPrimaryPrincipal(); // TODO 获取需要修改为根据当前登录用户查询数据库,获取实际对应的权限 return info; }}

2. 使用 shiro 的方法注解方式进行权限控制(基于代理技术实现)

2.1 在spring配置文件中开启shiro注解支持

2.2 在Action类中的方法上,使用shiro框架提供的注解,@RequiresPermissions("权限名称")

  • 在权限不足时,会抛出如下异常:

1222878-20171123124305461-200105089.png

2.3 在 struts.xml 中配置全局异常捕获,当shiro框架抛出权限不足异常时,跳转到权限不足提示页面

/unauthorized.jsp

3. 使用shiro提供的页面标签方式进行权限控制

3.1 在jsp页面中,引入shiro的标签库:

  • <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%>

3.2 使用shiro的标签控制页面元素的展示

使用 ehcache 缓存权限数据

1. 导入jar包: com.springsource.net.sf.ehcache

2. 在项目中提供 ehcache 的配置文件

3. 在spring配置文件中配置缓存管理器对象,并注入给安全管理器对象

// applicationContext.xml

转载于:https://www.cnblogs.com/linkworld/p/7883039.html

你可能感兴趣的文章
南阳oj488--素数环(Dfs + 剪枝)
查看>>
[Flutter] TextField 中只允许输入合法的小数
查看>>
SPOJ 1479 +SPOJ 666 无向树最小点覆盖 ,第二题要方案数,树形dp
查看>>
优秀网址收集(欢迎补充)
查看>>
如何利用awk计算文件某一列的平均值?
查看>>
luogu P1346电车(克鲁斯卡尔)
查看>>
绑定DataGrid Column的Visibility属性到Model中
查看>>
进程内存分配
查看>>
Bailian 2808 校门外的树(入门线段树)
查看>>
002-打开文件管理规范-20190406.bat
查看>>
IPMI总结
查看>>
Tarjan的学习笔记 求割边求割点
查看>>
基于AADL的嵌入式软件的开发方法
查看>>
hosting company 的 mail , localhost send 不到
查看>>
gulp 使用入门
查看>>
9.spring:事务管理(下):声明式事务管理
查看>>
8、设计模式-结构型模式-适配器模式
查看>>
macOS 安装 pip
查看>>
Redis的学习使用
查看>>
python3-cookbook
查看>>