shiro 注解方式的權限控制基於代理實現,
如果寫了用了多個注解會按照內定的順序一個一個驗證, 而不是按使用的先后順序.
RequiresRoles
RequiresPermissions
RequiresAuthentication
RequiresUser
RequiresGuest
@Bean
@DependsOn({"lifecycleBeanPostProcessor"})
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
}
//權限控制map
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
//filterChainDefinitionMap.put("/user/**", "roles[user]");
filterChainDefinitionMap.put("/user/**", "perms[user]");
filterChainDefinitionMap.put("/account/**", "perms[account]");
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
Set<String> set = new HashSet<String>();
//set.add("users");
//info.setRoles(set);
set.add("user");
info.setStringPermissions(set);
return info;
url基於過濾器實現:
//自定義過濾器
Map<String, Filter> filterMap = new LinkedHashMap<>();
shiroFilterFactoryBean.setFilters(filterMap);
filterChainDefinitionMap.put("/user/**", "authc");
filterChainDefinitionMap.put("/**", "authc");
filterChainDefinitionMap.put("/user/**", "requestURL"); //必須在/**,authc之前添加被控制的路徑
@Autowired
IPermissionService permissionService;
public static URLPathMatchingFilter testUtils;
// @Autowired 注入失敗 使用此方式 @PostConstruct
@PostConstruct
public void init() {
testUtils = this;
}
//保存當前地址並重定向到登錄界面 參考張開濤大神的<跟我學shiro>
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
saveRequestAndRedirectToLogin(req, resp);
return false;
項目源碼地址 (問題多多,請不吝賜教)