版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Back_Light_F/article/details/81486204
Coding之前,先来解释一下相关的概念吧
- 授权:也称访问控制,即在应用中控制谁访问哪些资源(如访问页面/编辑数据/页面操作/等)。在授权中需了解几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。
- 主体(Subject):访问应用的用户,在Shiro中使用Subject代表该用户,用户只有授权后才能访问响应的资源。
- 资源(Resource):在应用中用户可以访问的URL,比如访问JSP页面、查看/编辑某些数据、访问某个业务方法、打印文本等都是资源,用户只有授权后才能访问。
- 权限(Permission):安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权利。即权限表示在应用中用户能不能访问某个资源,如:访问用户列表页面CRUD等。权限代表了用户有没有操作某个资源的权利,即反映在某个资源上的操作允不允许。
- Shiro支持粗粒度权限(如用户模块的所有权限)和细粒度权限(操作某个用户的权限,即实例级别的)
- 角色(Role):权限的集合,一般情况下会赋予用户角色而不是权限,这样用户既可以拥有一组权限,赋予权限时比较方便,典型的如:项目经理、技术总监等都是角色,不同的角色拥有一组不同的权限。
授权方式:Shiro支持三种授权方式的授权:
- 编程式:通过写if/else授权代码块完成
- 注解式:通过在执行的java方法上放置相应的注解完成,没有权限将抛出相应的异常
- JSP/GSP标签:在JSP/GSP页面通过相应的标签完成。
默认拦截器:
Shiro内置了很多默认的拦截器,比如身份验证、授权等相关的。默认拦截器可以参考DefaultFilter类:
这里介绍一下roles角色过滤器:
1.先创建两个页面:user.jsp和admin.jsp
没有配置过滤器时以任何身份(user/admin(之前代码中有))都可以访问的。
现在配置roles过滤器:
/user.jsp = roles[user]
/admin.jsp = roles[admin]
再次登录后访问两个页面:跳转到无权限的页面:
授权的Realm如何实现:
需要继承AuthorizingRealm类,并实现其doGetAuthorizationInfo方法
Coding:实现授权Realm:
将之前的ShiroRealm的父类改为AuthorizingRealm,并实现其doGetAuthorizationInfo方法:
/*
* 授权时需要实现的方法
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//1.从PrincipalCollection获取登录用户的信息
Object principal = principals.getPrimaryPrincipal();
//2.利用登录的用户的信息来获取当前用户的角色或权限(可能需要查询数据库)
Set<String> roles = new HashSet<String>();
roles.add("user");
if("admin".equals(principal)){
roles.add("admin");
}
//3.创建SimpleAuthorizationInfo,并设置其roles属性
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);
//4.返回SimpleAuthorizationInfo对象
return info;
}
启动项目,访问:
发现admin用户是都可以访问的,user用户只能访问user.jsp页面