shiro.ini实现授权
前提:必须先认证通过之后有授权之说
1,授权概述
授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。
2,关键对象介绍
1,主体
主体,即访问应用的用户,在Shiro中使用Subject代表该用户。用户只有授权后才允许访问相应的资源。
2,资源
在应用中用户可以访问的任何东西,比如访问JSP 页面、查看/编辑某些数据、访问某个业务方法、打印文本等等都是资源。用户只要授权后才能访问。
3,权限
安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权力。即权限表示在应用中用户能不能访问某个资源,如:访问用户列表页面查看/新增/修改/删除用户数据(即很多时候都是CRUD(增查改删)式权限控制)打印文档等等。。。
4,角色
角色代表了操作集合,可以理解为权限的集合,一般情况下我们会赋予用户角色而不是权限,即这样用户可以拥有一组权限,赋予权限时比较方便。典型的如:项目经理、技术总监、CTO、开发工程师等都是角色,不同的角色拥有一组不同的权限。
3,授权流程
4,相关方法说明
1 subject.hasRole(“”); 判断是否有角色
2 subject.hasRoles(List);分别判断用户是否具有List中每个内容
3 subject.hasAllRoles(Collection);返回boolean,要求参数中所有角色用户都需要具有.
4 subject.isPermitted(“”);判断是否具有权限.
5 subject.isPermittedAll(“”);判断是否具有权限.
shiro.ini
#配置用户
[users]
zhangsan=123456,role1
lisi=123456,role2
wangwu=123456,role3
zhaoliu=123456,role2,role3
sunqi=123456,role4
#声明角色
[roles]
role1=user:query,user:add,user:update,user:delete,user:export
role2=user:query,user:add
role3=user:query,user:export
role4=*:*
TestAuthorizationApp.java
package com.sxt.shiro;
import java.util.Arrays;
import java.util.List;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* shiro的认证使用shiro.ini文件
*
*/
@SuppressWarnings("deprecation")
public class TestAuthorizationApp {
// 日志输出工具
private static final transient Logger log = LoggerFactory.getLogger(TestAuthorizationApp.class);
public static void main(String[] args) {
String username = "zhangsan";
String password = "123456";
log.info("My First Apache Shiro Application");
// 1,创建安全管理器的工厂对象 org.apache.shiro.mgt.SecurityManager; 不能使用java.lang.SecurityManager
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
// 2,使用工厂创建安全管理器
SecurityManager securityManager = factory.getInstance();
// 3,把当前的安全管理器绑定当到线的线程
SecurityUtils.setSecurityManager(securityManager);
// 4,使用SecurityUtils.getSubject得到主体对象
Subject subject = SecurityUtils.getSubject();
// 5,封装用户名和密码
AuthenticationToken token = new UsernamePasswordToken(username, password);
// 6,得到认证
try {
subject.login(token);
System.out.println("认证通过");
} catch (AuthenticationException e) {
System.out.println("用户名或密码不正确");
}
//subject.logout();//退出的方法
//判断用户是否认证通过
boolean authenticated = subject.isAuthenticated();
System.out.println("是否认证通过:"+authenticated);
//角色判断
boolean hasRole1 = subject.hasRole("role1");
System.out.println("是否有role1的角色:"+hasRole1);
//分别判断集合里面的角色 返回数组
List<String> roleIdentifiers=Arrays.asList("role1","role2","role3");
boolean[] hasRoles = subject.hasRoles(roleIdentifiers);
for (boolean b : hasRoles) {
System.out.println(b);
}
//判断当前用户是否有roleIdentifiers集合里面的所有角色
boolean hasAllRoles = subject.hasAllRoles(roleIdentifiers);
System.out.println(hasAllRoles);
//权限判断
boolean permitted = subject.isPermitted("user:query");
System.out.println("判断当前用户是否有user:query的权限 "+permitted);
boolean[] permitted2 = subject.isPermitted("user:query","user:add","user:export");
for (boolean b : permitted2) {
System.out.println(b);
}
boolean permittedAll = subject.isPermittedAll("user:query","user:add","user:export");
System.out.println(permittedAll);
}
}