权限控制
Shiro中的过滤器
Shiro中定义了很多过滤器:
- 认证相关
- anon:允许匿名访问
- authc:必须登录后才能访问
- logout:登出
- 授权相关
- roles:角色授权过滤器,给某个url设置特定的角色才能访问
- perms:权限过滤器,给某个url设置特定权限才能访问
授权需要实现的Realm
授权需要继承AuthorizingRealm类,并重写其doGetAuthorizationInfo()方法
AuthorizingRealm类可以同时实现doGetAuthorizationInfo()跟doGetAuthenticationInfo()方法,因此可以在一个Realm中同时做认证跟授权
现在在配置类中给两个url分别设置不同的角色才能访问
map.put("/admin", "roles[admin]");
map.put("/user", "roles[admin1]");
在Realm中实现用户角色赋予
在方法中实现如果是admin用户登录的就给这个用户赋予admin跟admin1两个角色,其他的只赋予admin1这一个角色
@Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) { // 1. 从principalCollection中来获取登录用户的信息 Object primaryPrincipal = principal.getPrimaryPrincipal(); // 2. 利用登录的用户信息来获取当前用户的角色或权限(可能需要查询数据库) Set<String> roles = new HashSet<>(); roles.add("admin1"); if ("admin".equals(primaryPrincipal)) { roles.add("admin"); } // 3. 创建并返回SimpleAuthorizationInfo,并设置其roles属性 return new SimpleAuthorizationInfo(roles); }
在Realm中实现用户权限赋予
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { //从principals获取主身份信息 String userCode = (String) principals.getPrimaryPrincipal(); //根据身份信息获取权限信息 //先链接数据库。。。 //模拟从数据库获取数据 List<String> permissions = new ArrayList<String>(); permissions.add("admin:*");//用户的创建权限 permissions.add("user:update");//用户的修改 permissions.add("item:add");//商品的添加权限 //查到权限数据,返回 SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(); //将List里面的权限填充进去 simpleAuthorizationInfo.addStringPermissions(permissions); return simpleAuthorizationInfo; }
权限注解
- @RequiresAuthentication: 表示当前Subject已经通过login进行了身份验证,即Subject.isAuthenticated()返回true
- @RequiresUser: 表示当前Subject已经身份验证或者通过记住我登录
- @RequiresGuest: 表示当前Subject没有身份验证或者通过记住我登录,即是游客身份
- @RequiresRoles(value = {“admin“, ”user“}, logical = Logical.AND):表示当前Subject需要角色admin和user
- @RequiresPermissions(value = {“user:a”, “user:b”}, logical = Logical.OR): 表示当前Subject需要权限user:a 或者 user:b
使用shiro标签
Maven依赖
<dependency> <groupId>com.github.theborakompanioni</groupId> <artifactId>thymeleaf-extras-shiro</artifactId> <version>1.2.1</version> </dependency>
配置类中配置
@Bean public ShiroDialect shiroDialect() { return new ShiroDialect(); }
xml配置
<!-- 配置shiro方言 --> <bean name="shiroDialect" class="at.pollux.thymeleaf.shiro.dialect.ShiroDialect"/> <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine"> <property name="templateResolver" ref="templateResolver"/> <property name="additionalDialects" ref="shiroDialect"/> </bean>
在html中加入xmlns
<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
例:
<button shiro:hasPermission="sys:user:add" type="button" class="btn btn-primary" onclick="add()"> <i class="fa fa-plus" aria-hidden="true"></i>添加 </button>
Shiro中的标签
- <p shiro:guest=””>: 验证当前用户是否为”访客“,即未认证的(包含未记住的)用户
- shiro:user=””: 认证通过或者已经记住的用户
- shiro:authenticated=””: 已经认证通过的用户,不包括记住的用户,这是与user标签的本质区别
- shiro:principal: 用户名
- shiro:notAuthenticated: 未通过认证的用户,与authenticated相对应,与guest标签的区别是,该标签包含已经记住的用户
- shiro:hasRole=”admin“: 验证当前用户是否属于该角色
- shiro:lacksRole: 与hasRole逻辑相反,当用户不属于该角色时验证通过
- shiro:hasAllRoles=”admin, user, vip”: 验证当前用户是否属于标签中列出的所有角色
- shiro:hasAnyRoles=”admin, vip, developer”: 验证当前用户是否拥有标签中所列的任意一个用户
- shiro:hasPermission=”user:add”: 验证当前用户是否拥有制定权限
- shiro:lacksPermission=”user:del”: 与hasPermission逻辑相反。当前用户没有该权限时验证通过
- shiro:hasAllPermissions=”user:add, user:del”: 验证当前用户是否拥有标签中所列的所有权限
- shiro:hasAnyPermissions=”user:view, user:del”: 判断当前用户是否拥有标签中所列的任意一个权限