shiro基础学习(三)—shiro授权
来源:互联网 发布:beanpole 知乎 编辑:程序博客网 时间:2024/05/24 04:32
一、入门程序
1.授权流程
2.授权的三种方式
(1)编程式: 通过写if/else 授权代码块完成。
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole("admin")) {
//有权限
} else {
//无权限
}
(2)注解式: 通过在执行的Java方法上放置相应的注解完成。
@RequiresRoles("admin")
public void hello() {
//有权限
}
(3)JSP/GSP 标签: 在JSP/GSP 页面通过相应的标签完成。
<shiro:hasRole name="admin">
<!— 有权限—>
</shiro:hasRole>
3.ini文件
shiro-permission.ini
在ini文件中用户、角色、权限的配置规则是:“用户名=密码,角色1,角色2...” “角色=权限1,权限2...”,首先根据用户名找角色,再根据角色找权限,角色是权限集合。
权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。
例子:
用户创建权限: user:create,或user:create:*
用户修改实例001的权限: user:update:001
用户实例001的所有权限: user:*:001
4.测试代码
/* * 授权的测试 */public class AuthorzationTest{ //角色授权、资源授权测试 @Test publicvoid testAuthorzation(){ //创建SecurityManager工厂 Factory<SecurityManager> factory =new IniSecurityManagerFactory("classpath:shiro-permission.ini"); //创建SecurityManager SecurityManager securityManager = factory.getInstance(); //将SecurityManager设置到系统环境 SecurityUtils.setSecurityManager(securityManager); //创建Subject Subject subject = SecurityUtils.getSubject(); //创建token令牌 UsernamePasswordToken token =new UsernamePasswordToken("zhangsan","123"); //执行认证 try{ subject.login(token); }catch(AuthenticationException e){ e.printStackTrace(); } System.out.println("是否认认证通过: "+ subject.isAuthenticated()); //基于角色的授权(角色标识) booleanhasRole = subject.hasRole("role3"); System.out.println("基于角色的授权: "+ hasRole); //基于资源的授权(权限标识符) booleanpermitted = subject.isPermitted("user:create"); System.out.println("基于资源的授权: "+ permitted); } }
结果:
是否认认证通过: true
基于角色的授权: false
基于资源的授权: true
二、自定义Realm
1.shiro-realm.ini
在shiro-realm.ini中配置自定义的realm,将realm设置到securityManager中。
2.实现代码
/* * 自定义Realm */public class CustomRealm extendsAuthorizingRealm{ //设置Realm名称 @Override publicvoid setName(String name){ super.setName("customRealm"); } //用于认证 @Override protectedAuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)throws AuthenticationException{ //1.从token取出用户身份信息 String userCode = (String)token.getPrincipal(); //2.根据用户userCode查询数据库 //模拟从数据库查询到的密码 String password ="123"; //3.查询到返回认证信息 SimpleAuthenticationInfo info =new SimpleAuthenticationInfo(userCode,password,this.getName()); returninfo; } //用于授权 @Override protectedAuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals){ //获取主身份信息 String userCode = (String)principals.getPrimaryPrincipal(); //根据身份信息获取权限信息 //模拟从数据库获取到数据 List<String> permissions =new ArrayList<String>(); permissions.add("user:create");//用户的创建权限 permissions.add("items:add");//商品的添加权限 //将查询到授权信息填充到对象中 SimpleAuthorizationInfo info =new SimpleAuthorizationInfo(); info.addStringPermissions(permissions); returninfo; }}
3.测试代码
@Testpublic void testCusRealm(){ //创建SecurityManager工厂 Factory<SecurityManager> factory =new IniSecurityManagerFactory("classpath:shiro-realm.ini"); //创建SecurityManager SecurityManager securityManager = factory.getInstance(); //将SecurityManager设置到系统环境 SecurityUtils.setSecurityManager(securityManager); //创建Subject Subject subject = SecurityUtils.getSubject(); //创建token令牌 UsernamePasswordToken token =new UsernamePasswordToken("zhangsan","123"); //执行认证 try{ subject.login(token); }catch(AuthenticationException e){ e.printStackTrace(); } System.out.println("是否认认证通过: "+ subject.isAuthenticated()); //基于资源的授权(权限标识符) booleanpermitted = subject.isPermitted("user:create"); System.out.println("基于资源的授权: "+ permitted);}
}
- shiro基础学习(三)—shiro授权
- shiro基础学习(三) shiro授权
- shiro学习:shiro实现授权
- Apache Shiro学习(三)授权
- Shiro学习随笔【三】授权方式
- Apache Shiro (三) ---- 授权
- shiro框架基础--授权
- shiro基础学习(二)—shiro认证
- Apache Shiro 使用手册(三)Shiro 授权
- Apache Shiro 使用手册(三)Shiro 授权
- Apache Shiro 使用手册(三)Shiro 授权
- Apache Shiro 使用手册(三)Shiro 授权
- Apache Shiro 使用手册(三)Shiro 授权
- Apache Shiro 使用手册(三)Shiro 授权
- Apache Shiro 使用手册(三)Shiro 授权
- Apache Shiro 使用手册(三)Shiro 授权
- Apache Shiro 使用手册(三)Shiro 授权
- Apache Shiro(三)Shiro 授权
- Python_Django-4
- hibernate缓存机制
- Android Permission权限列表以及Android6.0以后获取权限
- linux011文件系统中缓冲区管理函数分析
- Android 使用Rtmp音视频推流——非常具有参考意义
- shiro基础学习(三)—shiro授权
- DDOS工具合集
- Centos阿里云服务器换yum源
- POJ2676 Sudoku(dfs)
- Java模拟新浪微博登陆抓取数据
- android流量控制
- Visual Studio Code 1.13 发布,赶紧试试
- angular路由 ui.router
- 使用pycharm编辑自动化脚本,执行后没有html报告生成的几种解决办法