該篇博客主要內(nèi)容:以yml配置文件的方式滩报,動態(tài)注入需要配置的權(quán)限
接上一篇博客 > Springboot整合Shiro:詳細的權(quán)限管理
*******轉(zhuǎn)載請說明出處座每,謝謝 ********
上篇文章寫到授權(quán)實現(xiàn)的兩種方式(編程式和注解式),兩者在使用時對權(quán)限的配置都是寫死的恢口,如果后期項目需要維護屑宠,更改權(quán)限配置困檩,就無可避免的要進行代碼的修改腰埂。
比如:現(xiàn)在需要將cat
角色改為rabbit
,那么編程式授權(quán)需要將subject.hasRole("cat")
改為subject.hasRole("rabbit")
飒焦,注解式授權(quán)需要將@RequiresRoles("cat")
改為@RequiresRoles("rabbit")
,使用起來很笨重屿笼。
這時候牺荠,動態(tài)配置權(quán)限便顯得很有必要了,我們通過讀取數(shù)據(jù)庫或者權(quán)限的配置文件將權(quán)限注入刁卜,如果需要修改志电,我們只需要修改數(shù)據(jù)庫或者修改相關(guān)的配置文件即可曙咽,無需重新部署項目蛔趴。
如何操作?以yml配置文件為例:
1.定義關(guān)于權(quán)限的配置文件
我們在application.yml(這里將application.prpperties文件改為.yml文件例朱,因為.yml文件用起來更簡潔孝情,當然.properties文件一樣實現(xiàn)功能)
中添加需要配置的權(quán)限
##動態(tài)權(quán)限配置文件
#List<Map<String, String>>
permission-config:
perms:
- url: /cat
permission: roles[cat]
- url: /dog
permission: roles[dog]
- url: /sing
permission: perms[sing]
- url: /jump
permission: perms[jump]
- url: /rap
permission: perms[rap]
- url: /basketball
permission: perms[basketball]
- 將配置文件信息的內(nèi)容轉(zhuǎn)化為
List<Map<String, String>>
,注入到ShiroConfig
中洒嗤。
新建PermsMap
類
/**
* @Description 權(quán)限Map 接受配置文件中的數(shù)據(jù)
* @Author 張小黑的貓
* @data 2019-05-27 11:19
*/
@Component
@ConfigurationProperties(prefix = "permission-config")
public class PermsMap {
private List<Map<String,String>> perms;
public List<Map<String, String>> getPerms() {
return perms;
}
public void setPerms(List<Map<String, String>> perms) {
this.perms = perms;
}
}
注意:prefix="permission-config"和perms要與.yml文件中的屬性對應(yīng)
- 修改
ShiroConfig.java
先使用@Autowired
注入PermsMap
箫荡,切記不能使用new PermsMap ()
@Autowired
PermsMap permsMap;
更改過濾鏈
/**
* 配置Shiro的Web過濾器,攔截瀏覽器請求并交給SecurityManager處理
* @return
*/
@Bean
public ShiroFilterFactoryBean webFilter(SecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//設(shè)置securityManager
shiroFilterFactoryBean.setSecurityManager(securityManager);
//配置攔截鏈 使用LinkedHashMap,因為LinkedHashMap是有序的渔隶,shiro會根據(jù)添加的順序進行攔截
// Map<K,V> K指的是攔截的url V值的是該url是否攔截
Map<String,String> filterChainMap = new LinkedHashMap<String,String>(16);
//配置退出過濾器logout羔挡,由shiro實現(xiàn)
filterChainMap.put("/logout","logout");
//authc:所有url都必須認證通過才可以訪問; anon:所有url都都可以匿名訪問,先配置anon再配置authc。
filterChainMap.put("/login","anon");
// 未授權(quán)界面;
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
// //權(quán)限注入
// filterChainMap.put("/cat","roles[cat]");
//動態(tài)權(quán)限注入
List<Map<String,String>> perms = permsMap.getPerms();
perms.forEach(perm->filterChainMap.put(perm.get("url"),perm.get("permission")));
filterChainMap.put("/**", "authc");
//設(shè)置默認登錄的URL.
shiroFilterFactoryBean.setLoginUrl("/login");
System.out.println(filterChainMap);
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainMap);
return shiroFilterFactoryBean;
}
動態(tài)注入要滿足格式filterChainMap.put("/cat","roles[cat]");
這里面又額外配置了未授權(quán)界面shiroFilterFactoryBean.setUnauthorizedUrl("/403");
對未通過權(quán)限驗證的界面進行統(tǒng)一跳轉(zhuǎn)403頁面的操作,所以需要配置對應(yīng)的頁面跳轉(zhuǎn)间唉。
@GetMapping("/403")
public String page_403(){
return "403";
}
4.更改AuthorizationController
@RestController
public class AuthorizationController {
@GetMapping("/cat")
public String cat(){
return "cat";
}
@GetMapping("/dog")
public String dog(){
return "dog";
}
@GetMapping("/sing")
public String sing(){
return "sing";
}
@GetMapping("/jump")
public String jump(){
return "jump";
}
@GetMapping("/rap")
public String rap(){
return "rap";
}
@GetMapping("/basketball")
public String basketball(){
return "basketball";
}
}
5.測試結(jié)果:
共同學習绞灼,歡迎指正修改~ 喵喵喵?
下一篇文章:Springboot整合Shiro: Redis緩存