shiro 是一個比較流行的權限管理框架,下面咱們來看怎麼將他應用到咱們本身的項目裏面。html
第一步:找到maven 依賴。java
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.3.2</version> </dependency>
第二步:自定義一個 realm 進行身份認證。web
public class DemoRealm extends AuthorizingRealm{ @Override public boolean supports(AuthenticationToken token) { return token instanceof JwtToken; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { System.out.println("身份認證開始~"); JwtToken userToken = (JwtToken) token; String username = JwtUtil.getUsername(userToken.getToken()); String password = "tianba.0821"; if(username == null || "".equals(username.trim())) { throw new AccountException("token不正確"); } if(!"yuxiong".equals(username)) { throw new AccountException("用戶名不正確"); } if(!JwtUtil.verify(userToken.getToken(), username, password)) { throw new AccountException("密碼不正確"); } return new SimpleAuthenticationInfo(userToken.getToken(),userToken.getToken(),getName()); } @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { System.out.println("認證權限開始~"); System.out.println(principals.getPrimaryPrincipal()); //String username = (String) SecurityUtils.getSubject().getPrincipal(); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo (); Set<String> set = new HashSet<>(); set.add("user"); info.setRoles(set); return info; } }
我這裏採用簡單的jwt 認證 也沒有跟數據庫交互,若是須要也是須要咱們本身寫查詢在realm中去認證。spring
第三步:添加shiro的核心配置數據庫
import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import javax.servlet.Filter; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.example.demo.shiro.DemoRealm; import com.example.demo.shiro.JwtFilter; @Configuration public class ShiroConfig { @Bean public DemoRealm demoRealm() { // 建立 realm實例 return new DemoRealm(); } @Bean public SecurityManager securityManager(DemoRealm demoRealm) { // 建立 SecurityManager實例 DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(demoRealm); return securityManager; } @Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { // 初始化ShiroFilterFactoryBean ShiroFilterFactoryBean factory = new ShiroFilterFactoryBean(); factory.setSecurityManager(securityManager); factory.setUnauthorizedUrl("/user/notRole"); // 設置未認證的跳轉路徑 Map<String,Filter> filters = new HashMap<>(); filters.put("perms",new JwtFilter()); // 添加自定義過濾器 factory.setFilters(filters); // 設置過濾器 Map<String, String> map = new LinkedHashMap<>(); map.put("/swagger-ui.html", "anon"); // swagger-ui.html 訪問界面 map.put("/swagger-resources/**", "anon"); // swagger-ui.html 訪問界面 map.put("/v2/api-docs/**", "anon"); // swagger-ui.html 訪問界面 map.put("/webjars/**", "anon"); // swagger-ui.html 訪問界面 map.put("/visitor/**", "anon"); // 設置此路徑不須要認證 map.put("/user/**", "roles[user]"); // 設置訪問此路徑須要 user 權限 map.put("/admin/**", "roles[admin]"); // 是個訪問此路勁須要 admin權限 map.put("/login/**", "anon"); // 設置此路勁不須要認證 map.put("/**", "perms"); // 添加自定義過濾器 factory.setFilterChainDefinitionMap(map); // 設置攔截路徑 return factory; } }
番外篇:簡單讀一下 ShiroFilterFactoryBean的原碼。apache
一進來就看見咱們 在 shiro核心配置文件中配置的內容了,securityManage,自定義的 filter ,咱們定義的攔截的路徑 filterChainDefinitionMap,已經設置的登陸路徑,登陸成功路徑,未認證的路徑。這是否是就很清楚的解釋了 咱們爲何須要配置這些配置項目啊,由於須要,哈哈哈哈。api
而後咱們一塊兒來看幾個方法。框架
這個方法 就是將咱們的攔截器配置 封裝到 DefaultFilterChainManager 類中 ,而後咱們再讀一下 DefaultFilterChainManager 類maven
是否是也有 咱們剛剛封裝進了的 參數兩個 map 。 而後 FilterConfig 這個類來自 javax.servlet 包,對 filter 進行配置。ide
而後在 DefaultFilterChainManager 類中的 addFilter 方法中進行 filter 的初始化