【Shiro】04 ini授权实现
【授权概念】
访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。
在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。
授权的前提是认证通过。
(简单说,我只有进系统了我才能知道我可以做什么,系统都进不了怎么授权)
【关键对象】
1,主体
主体,即访问应用的用户,在Shiro中使用Subject代表该用户。
用户只有授权后才允许访问相应的资源。
2,资源
在应用中用户可以访问的任何东西,
比如访问JSP 页面、查看/编辑某些数据、访问某个业务方法、打印文本等等都是资源。
用户只要授权后才能访问。
3,权限
安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权力。
即权限表示在应用中用户能不能访问某个资源,
如:访问用户列表页面查看/新增/修改/删除用户数据(即很多时候都是CRUD(增查改删)式权限控制)打印文档等等。。。
4,角色
角色代表了操作集合,可以理解为权限的集合,
一般情况下我们会赋予用户角色而不是权限,即这样用户可以拥有一组权限,赋予权限时比较方便。
典型的如:项目经理、技术总监、CTO、开发工程师等都是角色,不同的角色拥有一组不同的权限。
【授权流程】
【相关方法】
1 subject.hasRole(""); 判断是否有角色 2 subject.hashRoles(List); 分别判断用户是否具有List中每个内容 3 subject.hasAllRoles(Collection); 返回boolean,要求参数中所有角色用户都需要具有. 4 subject.isPermitted(""); 判断是否具有权限.
【shiro.ini配置】
#配置用户 [users] admin=123456,role1 user01=123456,role2 user02=123456,role3 user03=123456,role2,role3 #声明角色 [roles] role1=user:query,user:add,user:update,user:delete,user:export role2=user:query,user:add role3=user:query,user:export
测试类编写:
// 日志输出工具 private static final transient Logger log = LoggerFactory.getLogger(AuthenticationTest.class); @SuppressWarnings("deprecation") public static void main(String[] args) { String username = "admin"; String password = "123456"; log.info("My First Apache Shiro Application"); DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); defaultSecurityManager.setRealm(new IniRealm("classpath:shiro.ini")); SecurityUtils.setSecurityManager(defaultSecurityManager); Subject subject = SecurityUtils.getSubject(); try { subject.login(new UsernamePasswordToken(username, password)); log.info("登陆成功"); } catch (AuthenticationException authenticationException) { authenticationException.printStackTrace(); log.error("用户名称或者密码不符合"); } // 是否认证通过 boolean authenticated = subject.isAuthenticated(); log.info("是否认证通过:"+authenticated); // 角色验证 boolean hasRole1 = subject.hasRole("role1"); log.info("是否有role1的角色:"+hasRole1); //分别判断集合里面的角色 返回数组 List<String> roleIdentifiers= Arrays.asList("role1","role2","role3"); boolean[] hasRoles = subject.hasRoles(roleIdentifiers); for (boolean hasRole : hasRoles) { log.info(String.valueOf(hasRole)); } //判断当前用户是否有roleIdentifiers集合里面的所有角色 boolean hasAllRoles = subject.hasAllRoles(roleIdentifiers); log.info(String.valueOf(hasAllRoles)); // ---------------------------------------------------------- //权限判断 boolean permitted = subject.isPermitted("user:query"); log.info("判断当前用户是否有user:query的权限 "+permitted); boolean[] permitted2 = subject.isPermitted("user:query","user:add","user:export"); for (boolean b : permitted2) { log.info(String.valueOf(b)); } boolean permittedAll = subject.isPermittedAll("user:query","user:add","user:export"); log.info(String.valueOf(permittedAll)); }
测试结果:
[main] INFO AuthenticationTest - My First Apache Shiro Application [main] INFO org.apache.shiro.session.mgt.AbstractValidatingSessionManager - Enabling session validation scheduler... [main] INFO AuthenticationTest - 登陆成功 [main] INFO AuthenticationTest - 是否认证通过:true [main] INFO AuthenticationTest - 是否有role1的角色:true [main] INFO AuthenticationTest - true [main] INFO AuthenticationTest - false [main] INFO AuthenticationTest - false [main] INFO AuthenticationTest - false [main] INFO AuthenticationTest - 判断当前用户是否有user:query的权限 true [main] INFO AuthenticationTest - true [main] INFO AuthenticationTest - true [main] INFO AuthenticationTest - true [main] INFO AuthenticationTest - true Process finished with exit code 0