什麼是授權
- 授權,即通路控制,控制誰能通路哪些資源。
- 主體進行身份認證後需要配置設定權限,方可通路系統的資源,對于某些資源沒有權限是無法通路的這就是授權。
使用 ini 的形式配置權限資訊
- 在 ini 檔案中設定使用者、角色、權限的配置規則。
- 使用者名=密碼,角色1,角色2 ...
- 首先根據使用者名找角色,再根據角色找權限,角色是權限集合。
- 權限字元串的規則
- “資源辨別符:操作:資源執行個體辨別符”
- 對哪個資源的哪個執行個體具有什麼操作。
-
是資源 / 操作 / 執行個體的分割符。
:
- 權限字元串也可以使用
通配符。
*
如下将給出一個配置示例如下所示,修改 shiro.ini:
[users]
#使用者bntang的密碼是1234,此使用者具有role1和role2兩個角色
#使用者jonathan_lee的密碼是1234,此使用者具有role2一個角色
bntang=1234,role1,role2
jonathan_lee=1234,role2
[roles]
#角色role1對資源user擁有create、update權限
role1=user:create,user:update
#角色role2對資源user擁有create、delete權限
role2=user:create,user:delete
#角色role3對資源user擁有create權限
role3=user:create
自定義 Realm 的形式權限
修改
MyRealm.java
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 擷取身份資訊
Object principal = principals.getPrimaryPrincipal();
// 根據使用者名查詢該使用者的角色和權限
List<String> roles = new ArrayList<>();
roles.add("role1");
roles.add("role2");
List<String> permissions = new ArrayList<>();
permissions.add("user:create");
permissions.add("user:delete");
// 把角色和權限與 subject 關聯在一起,然後進行傳回
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addRoles(roles);
info.addStringPermissions(permissions);
return info;
}

然後修改之前的測試類,具體修改的内容或者新增的内容如下代碼所示, 在認證成功之後才去做授權, 判斷目前的使用者是否有某一個角色和某一個權限
/**
* @author BNTang
*/
public class Demo {
public static void main(String[] args) {
IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("BNTang", "12345");
try {
subject.login(token);
} catch (UnknownAccountException e) {
System.out.println("使用者名不存在");
e.printStackTrace();
} catch (IncorrectCredentialsException e) {
System.out.println("密碼錯誤");
e.printStackTrace();
}
System.out.println("是否認證" + subject.isAuthenticated());
subject.logout();
System.out.println("是否認證" + subject.isAuthenticated());
// 判斷目前使用者有沒有角色1
System.out.println(subject.hasRole("role1"));
// 判斷目前使用者是否同時具備多個角色
System.out.println(subject.hasAllRoles(Arrays.asList("role1", "role3")));
// 判斷是否有某一個權限
System.out.println(subject.isPermitted("user:create"));
// 判斷是否同時有多個權限
System.out.println(subject.isPermittedAll("user:create", "user:update"));
}
}