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

相关文章
相关标签/搜索