授权管理
当然选择注解式开发啦,而且还可以用jsp隐藏没有权限的标签,非常方便。
在spring中配置的拦截器里面添加
- roles,角色授权拦截器
/xx = roles[admin1]
/xx = roles[admin2]
主要属性:登录页面地址、未授权地址 - perms,权限授权拦截器
/xx = perms[“user:create”]
主要属性:登录页面地址、未授权地址 - port,端口拦截器,可以通过的端口,如果端口不符,自动跳转到设置的端口
/xx = port[80] - rest,rest风格拦截器,自动根据请求方法构建权限字符串(这个我也没太懂,要用的话再查查别的……)
- ssl,SSL拦截器,只有请求是https才能通过,否则自动跳转到https端口(443)
实现授权Realm
授权Realm需要继承AuthorizingRealm类,实现其doGetAuthorizationInfo方法,注意要继承的这个类它自己继承了之前认证的时候需要继承的那个类,但是没有实现那个类需要的方法,所以要做授权可以只继承AuthorizingRealm类,再同时实现doGetAuthorizationInfo(授权方法)和doGetAuthenticationInfo(认证方法)方法即可。
授权Realm会获得一个PrincipalCollection类型的参数,从中可以得到登录用户的信息
//获取到的用户信息和多Realm认证的顺序有关,第一次获取到的就是认证成功返回的第一个信息
Object principal = principals.getPrimaryPrincipal();
//然后利用得到的用户信息来给该用户相应的权限
//下面这几句的意思按照我的理解,应该是roles里面存的值对应的就是各种权限
//admin1是一定会被添加的,所以所有用户都有该权限,但是满足xxx条件的时候,会给当前用户加上admin2的角色
//角色就意味着权限。
Set<String> roles = new HashSet<>();
roles.add("admin1");
if(xxx)
roles.add("admin2");
//最后返回
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);
return info;
注意:要是写完Realm发现不好用,注意看看配置对不对(我是用的默认策略,就是直接在securityManager的realms中配置的),还不行可以重启一下服务器,重新发布一下什么的操作搞一搞说不定就好了……
几个Shiro的JSTL标签,还有些这里就不写了
- <shiro:guest>标签,用户没有身份验证时。
- <shiro:user>标签,用户已经经过认证/记住我登录之后显示的信息
- <shiro:authenticated>标签,用户已经身份验证通过(不是记住我)
- <shiro:notAuthenticated>标签,用户未进行身份验证(包括记住我)
权限注解
- @RequiresAuthentication,已经过身份验证
- @RequiresUser,已经身份验证或记住我
- @RequiresGuest,游客身份
- @RequiresRoles(value={“admin1”,”admin2”},logical=Logical.AND):表示当前Subject需要角色admin1和admin2
- @RequiresPermissions(value={“user:a”,”user:b”},logical=Logical.OR):表示当前Subject需要权限user.a或user.b