spring boot 整合 shrio 權限管理

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 的初始化

相關文章
相關標籤/搜索