系统架构
在shiro架构中,有3个最主要的组件:Subject,SecurityManager,Realm。
Subject本质上就是当前访问用户的抽象描述。
SecurityManager是Shiro架构中最核心的组件,通过它可以协调其他组件完成用户认证和授权。实际上,SecurityManager就是Shiro框架的控制器。
Realm定义了访问数据的方式,用来连接不同的数据源,如:LDAP,关系数据库,配置文件等等。
1、认证
通过调用Subject.login(token)方法开始用户认证流程。
1 | Subject currentUser = SecurityUtils.getSubject(); |
shiro用户认证时序图:
2、授权
shiro访问授权有3种实现方式:api调用,java注解,jsp标签。
(1)在独立应用程序中访问授权通过api调用实现
1 | String role = "schwartz"; |
(2)在spring框架中可以通过java注解
1 |
|
jsp略。
shiro访问授权时序图:
注意事项
1.org.apache.shiro.realm.jdbc.JdbcRealm如果需要在授权时开启权限检查,必须设置permissionsLookupEnabled为true,否则只检查角色。
2.用户退出登录时,Shiro用户必须执行logout(),必须要注销Session信息,避免影响下一次用户认证和授权。
1 | SecurityUtils.getSubject().logout(); |
3.如果在数据库中存储的用户密码为编码值(如MD5加密),则在发送登录请求时传递的密码参数也必须是MD5加密结果,否则认证失败。
4.shiro框架只能控制操作权限,不能控制数据权限。数据权限与具体的业务紧密关联,无法通过一个通用的框架完成,通常都是利用关系数据库查询过滤实现。
对操作权限的控制有2层含义,其一:用户在前端只能看到对应权限的元素;其二:在后端对用户操作进行权限检查。