一、入門程序
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
public void 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());
//基於角色的授權(角色標識)
boolean hasRole = subject.hasRole("role3");
System.out.println("基於角色的授權: " + hasRole);
//基於資源的授權(權限標識符)
boolean permitted = 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 extends AuthorizingRealm{
//設置Realm名稱
@Override
public void setName(String name){
super.setName("customRealm");
}
//用於認證
@Override
protected AuthenticationInfo 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());
return info;
}
//用於授權
@Override
protected AuthorizationInfo 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);
return info;
}
}
3.測試代碼
@Test
public 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());
//基於資源的授權(權限標識符)
boolean permitted = subject.isPermitted("user:create");
System.out.println("基於資源的授權: " + permitted);
}



