spring boot集成shiro

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16855077/article/details/85228712

1.pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.cloudtech.sclimate</groupId>
	<artifactId>sclimate</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<packaging>war</packaging>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.4.RELEASE</version>
		<relativePath />
		<!-- lookup parent from repository -->
	</parent>

	<properties>
	    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <java.version>1.8</java.version>
		<maven-jar-plugin.version>2.6</maven-jar-plugin.version>
		<mybatis-spring-boot>1.2.0</mybatis-spring-boot>
		<druid.version>1.1.10</druid.version>
		<shiro.version>1.2.3</shiro.version>
		<httpclient.version>4.3.5</httpclient.version>
		<commons-net.version>3.3</commons-net.version>
		<quartz-version>2.2.1</quartz-version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- 热部署,不用重启 ,这个在这里不需要 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<optional>true</optional>
		</dependency>

		<!-- druid的starter -->
		<!-- <dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.9</version>
		</dependency> -->
		
		<!-- springboot操作数据库依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		
		<!-- webSocket -->  
		<dependency>     
           <groupId>org.springframework.boot</groupId>      
           <artifactId>spring-boot-starter-websocket</artifactId>
		</dependency>

		<!-- jsp解析器 -->
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<scope>provided</scope>
		</dependency>

		<!-- mybatis的starter -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
		</dependency>

		<!-- aop -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-starter -->
		<dependency>
		    <groupId>com.alibaba.boot</groupId>
		    <artifactId>dubbo-spring-boot-starter</artifactId>
		    <version>0.2.0</version>
		</dependency>

		<!-- 独立tomcat -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>

		<!-- freemarker模板引擎视图 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-freemarker</artifactId>
		</dependency>

		<!-- rabbitMQ -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
		</dependency>

		<!-- 自定义 -->

		<!-- commons-io -->
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.6</version>
		</dependency>

		<!-- commons-lang3 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
		</dependency>


		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>


	<!-- 	<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>${druid.version}</version>
		</dependency> -->
		
		<!--引入druid数据源-->
		<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.8</version>
		</dependency>


		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.8</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.8</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-scratchpad</artifactId>
			<version>3.8</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml-schemas</artifactId>
			<version>3.8</version>
		</dependency>

		<!-- timer tools -->
		<dependency>
			<groupId>joda-time</groupId>
			<artifactId>joda-time</artifactId>
		</dependency>

		<!-- shior框架 -->
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-core</artifactId>
			<version>${shiro.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-web</artifactId>
			<version>${shiro.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-cas</artifactId>
			<version>${shiro.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-spring</artifactId>
			<version>${shiro.version}</version>
		</dependency>
		<!-- shiro-ehcache-->
		<dependency>
		    <groupId>org.apache.shiro</groupId>
		    <artifactId>shiro-ehcache</artifactId>
		    <version>1.4.0</version>
		</dependency>

		<!-- JSP相关 -->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<!-- httpclient -->
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
		</dependency>

		<!-- fastJson -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.47</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>

		<dependency>
			<groupId>commons-net</groupId>
			<artifactId>commons-net</artifactId>
			<version>${commons-net.version}</version>
		</dependency>

		<!-- quartz -->
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
		</dependency>
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz-jobs</artifactId>
		</dependency>

		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>

		<!--mybatis -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>
   
		<!--通用Mapper -->
		<dependency>
			<groupId>tk.mybatis</groupId>
			<artifactId>mapper-spring-boot-starter</artifactId>
			<version>2.0.3</version>
		</dependency>
		<!--pageHelper分页 -->
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>1.2.5</version>
		</dependency>


		<!-- json analyz -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
		</dependency>
		
		<!-- 配置提示 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<!-- 资源文件拷贝插件 -->
		<!-- 	<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<configuration>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin> -->
			<!-- java编译插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-war-plugin</artifactId>
				<configuration>
					<failOnMissingWebXml>false</failOnMissingWebXml>
				</configuration>
			</plugin>


			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

2. ShiroConfigBean.java

package com.cloudtech.web.config;

import java.util.LinkedHashMap;
import java.util.Map;

import javax.servlet.Filter;

import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.filter.authc.LogoutFilter;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.cloudtech.web.auth.AuthenticationRealm;
import com.cloudtech.web.filter.AuthenticationFilter;

/**
 * 
 * @ClassName: ShiroConfigBean
 * @Description: shior配置
 * @author wude
 * @date 2018年9月17日
 *
 */
@Configuration
@AutoConfigureAfter(AuthenticationRealm.class)
public class ShiroConfigBean {
	private static final Logger logger = LoggerFactory.getLogger(ShiroConfigBean.class);
	
	/**
	 * Shiro配置Bean,引入依赖之后共需要做两件事,第一是配置,第二是自定义的realm
	 */
	@Bean("shiroFilter")
	public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") SecurityManager securityManager) {
		logger.info("ShiroConfiguration.shirFilter()");
		ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

		// 必须设置 SecurityManager
		shiroFilterFactoryBean.setSecurityManager(securityManager);
		
		// 设置login URL
		shiroFilterFactoryBean.setLoginUrl("/index/login");
		// 登录成功后要跳转的链接
		shiroFilterFactoryBean.setSuccessUrl("/index/main");
		// 未授权的页面
		shiroFilterFactoryBean.setUnauthorizedUrl("/index/unauthorized");
		
		  //自定义拦截器
        Map<String, Filter> filters = new LinkedHashMap<String, Filter>();
	    LogoutFilter logoutFilter = new LogoutFilter();
        logoutFilter.setRedirectUrl("/index/main");
        filters.put("logout", logoutFilter);
        filters.put("authc", new AuthenticationFilter());//登录成功后拦截至首页+验证码

		
		shiroFilterFactoryBean.setFilters(filters);
		
		// 拦截器.
		Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
		// 使静态资源 生效
		filterChainDefinitionMap.put("/druid/**", "anon");
		filterChainDefinitionMap.put("/assets/**", "anon");
		filterChainDefinitionMap.put("/js/**", "anon");
		filterChainDefinitionMap.put("/css/**", "anon");
		filterChainDefinitionMap.put("/images/**", "anon");
		// 设置登录的地址可以匿名访问,因为一开始没有用户验证
		filterChainDefinitionMap.put("/index/login", "anon");
		// 异常类
		//filterChainDefinitionMap.put("/Exception.class", "anon");
		filterChainDefinitionMap.put("/external/**", "anon");
		// 退出系统的过滤器
		filterChainDefinitionMap.put("/index/loginout", "logout");
		// 拦截信息
		filterChainDefinitionMap.put("/index/login", "authc");
		filterChainDefinitionMap.put("/index/verified", "anon");
		filterChainDefinitionMap.put("/index/unauthorized", "anon");
		// 最后
		filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        logger.info("shiroFilter注册完成");
		return shiroFilterFactoryBean;
	}
	
	 /**
     * 凭证匹配器
     * (由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了
     * )
     * @return
     */
    @Bean
    public HashedCredentialsMatcher hashedCredentialsMatcher(){
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
        hashedCredentialsMatcher.setHashAlgorithmName("md5");//散列算法:这里使用MD5算法;
        hashedCredentialsMatcher.setHashIterations(2);//散列的次数,比如散列两次,相当于 md5(md5(""));
        return hashedCredentialsMatcher;
    }



	// 这里提供密码加密后的字符串可以放在数据库使用
	public static void main(String[] args) {
		String hashAlgorithmName = "MD5";
		String credentials = "123456";
		int hashIterations = 1024;
		Object obj = new SimpleHash(hashAlgorithmName, credentials, null, hashIterations);
		System.out.println(obj);
	}

	// 将自己的验证方式加入容器,否则是不生效的
	@Bean(name = "myRealm")
	public AuthenticationRealm myShiroRealm() {
		AuthenticationRealm myShiroRealm = new AuthenticationRealm();
		//authorizationCacheName
		myShiroRealm.setAuthorizationCacheName("authorization");
	    logger.info("myRealm注册完成");
		return myShiroRealm;
	}

	
	 /**
     * 注入SecurityManager
     * @param myRealm
     * @return SecurityManager
     */
    @Bean(name = "securityManager")
    public DefaultWebSecurityManager securityManager(@Qualifier("myRealm") AuthenticationRealm myRealm) {
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(myRealm);
        manager.setCacheManager(ehCacheManager());
        logger.info("securityManager注册完成");
        return manager;
    }


	@Bean
	public EhCacheManager ehCacheManager() {
		logger.info("ShiroConfiguration.getEhCacheManager()");
		EhCacheManager cacheManager = new EhCacheManager();
		cacheManager.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
		return cacheManager;
	}

	
	 
	/**
	 *  开启shiro aop注解支持 使用代理方式;所以需要开启代码支持; 加入注解的使用,不加入这个注解不生效 
	 * @param securityManager
	 * @return
	 */
	@Bean
	public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(
			DefaultWebSecurityManager securityManager) {
		AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
		authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
		return authorizationAttributeSourceAdvisor;
	}
}

3.ehcache-shiro.xml(src/main/resources)

<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false" name="shiroCache" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">  
    <defaultCache
		maxElementsInMemory="10000"  
		eternal="false"  
		timeToIdleSeconds="120"  
		timeToLiveSeconds="120"  
		overflowToDisk="false"  
		diskPersistent="false"  
		diskExpiryThreadIntervalSeconds="120" />  
</ehcache>

4.认证类

package com.cloudtech.web.auth;
/**
 * 实现自定义shiro权限类
 * @author wude
 * @date 2015-06-19
 */
import java.text.MessageFormat;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.config.Ini;
import org.apache.shiro.config.Ini.Section;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;

import com.cloudtech.web.entity.Authority;
import com.cloudtech.web.service.AuthorityService;

public class FilterChainDefineSource implements FactoryBean<Ini.Section> {

	private String filterChainDefinitions;
	@Autowired
	private AuthorityService moduleServiceImpl;
	 /** 
     * 默认premission字符串 
     */  
	public static final String PREMISSIOM_STRING = "perms[\"{0}\"]";
	
	@SuppressWarnings("static-access")
	public Section getObject() throws Exception {
		//获取所有Resource  
		List<Authority> modules = moduleServiceImpl.getAllAuthorities();
		
		Ini ini = new Ini();
		//加载默认的url  
		ini.load(filterChainDefinitions);
		 //循环Resource的url,逐个添加到section中。section就是filterChainDefinitionMap,  
        //里面的键就是链接URL,值就是存在什么条件才能访问该链接  
		Ini.Section section = ini.getSection(ini.DEFAULT_SECTION_NAME);
		if(modules != null && modules.size() > 0){
			for(Authority module : modules){
				 //如果不为空值添加到section中  
				if(StringUtils.isNotEmpty(module.getUrl()) && StringUtils.isNotEmpty(module.getAuthority())){
					section.put(module.getUrl(), MessageFormat.format(PREMISSIOM_STRING, module.getAuthority()));
				}
			}
		}
		section.put("/**", "authc");
		return section;
	}
	
	 /** 
     * 通过filterChainDefinitions对默认的url过滤定义 
     *  
     * @param filterChainDefinitions 默认的url过滤定义 
     */  
	public void setFilterChainDefinitions(String filterChainDefinitions){
		this.filterChainDefinitions = filterChainDefinitions;
	}

	public Class<?> getObjectType() {
		return this.getClass();
	}

	public boolean isSingleton() {
		return false;
	}

}
package com.cloudtech.web.auth;

import org.apache.shiro.authc.UsernamePasswordToken;

/**
 * 登录令牌
 */
public class AuthenticationToken extends UsernamePasswordToken {

	private static final long serialVersionUID = 5898441540965086534L;
	/** 是否需要验证验证码 **/
	private Integer isCheck;
	/** 验证码 */
	private String code;
	/** 记住我 **/
	private boolean rememberMe;
	/** 手机号码 **/
	private String mobile;
	
	public AuthenticationToken(String username, String password, Integer isCheck, String code, boolean rememberMe, String host, String mobile) {
		super(username, password, rememberMe);
		this.rememberMe = rememberMe;
		this.isCheck = isCheck;
		this.code = code;
		this.mobile = mobile;
		super.setHost(host);
	}

	public Integer getIsCheck() {
		return isCheck;
	}
	public void setIsCheck(Integer isCheck) {
		this.isCheck = isCheck;
	}
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	public boolean isRememberMe() {
		return rememberMe;
	}
	public void setRememberMe(boolean rememberMe) {
		this.rememberMe = rememberMe;
	}
	public String getMobile() {
		return mobile;
	}
	public void setMobile(String mobile) {
		this.mobile = mobile;
	}
	
}
package com.cloudtech.web.auth;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import org.apache.commons.lang3.time.DateUtils;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.DisabledAccountException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

import com.cloudtech.web.dao.OperatorMapper;
import com.cloudtech.web.entity.Admin;
import com.cloudtech.web.entity.Authority;
import com.cloudtech.web.entity.Operator;
import com.cloudtech.web.entity.Role;
import com.cloudtech.web.service.AdminService;
import com.cloudtech.web.service.AuthorityService;
import com.cloudtech.web.service.RoleService;
import com.cloudtech.web.util.Constans;
import com.cloudtech.web.util.TimeUtils;
import com.cloudtech.web.vo.Principal;

/**
 * 权限认证
 */
public class AuthenticationRealm extends AuthorizingRealm {

	@Autowired
	private AdminService adminServiceImpl;
	@Autowired
	private AuthorityService moduleServiceImpl;
	@Autowired
	private RoleService roleServiceImpl;
	@Autowired
	private OperatorMapper operatorMapper;

	/**
	 * 获取认证信息
	 * @param token 令牌
	 * @return 认证信息
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(org.apache.shiro.authc.AuthenticationToken token) {
		AuthenticationToken authenticationToken = (AuthenticationToken) token;
		String username = authenticationToken.getUsername();
		String password = new String(authenticationToken.getPassword());
		String ip = authenticationToken.getHost();
		
		if (username != null && password != null) {
			Admin admin = adminServiceImpl.findByName(username);
			//if (admin == null) {
			if (admin == null) {
				throw new UnknownAccountException();
			}
			/*if(isCheck == 0 && StringUtils.isNotEmpty(ip) && !ip.equalsIgnoreCase(admin.getLoginIp())){
				throw new NeedAuthenticaException();
			}*/
			if (admin.getIsEnabled()) {
				throw new DisabledAccountException();
			}
			if (admin.getIsLocked()) {
				Date lockedDate = admin.getLockedDate();
				Date unlockDate = DateUtils.addMinutes(lockedDate, Constans.loginFailureLockTime);
				if (new Date().after(unlockDate)) {
					admin.setLoginFailureCount(0);
					admin.setIsLocked(false);
					admin.setLockedDate(null);
					adminServiceImpl.update(admin);
				} else {
					throw new LockedAccountException();
				}
			}
			if (!password.equalsIgnoreCase(admin.getPassword())) {
				int loginFailureCount = admin.getLoginFailureCount() + 1;
				if (loginFailureCount >= Constans.accountLockCount) {
					admin.setIsLocked(true);
					admin.setLockedDate(new Date());
				}
				admin.setLoginFailureCount(loginFailureCount);
				adminServiceImpl.update(admin);
				throw new IncorrectCredentialsException();
			}
			admin.setLoginIp(ip);
			admin.setLoginDate(new Date());
			admin.setLoginFailureCount(0);
			adminServiceImpl.update(admin);
			
			String lastLoginTime = TimeUtils.converStringDate(admin.getLoginDate(), Constans.FORMAT_TIME_ONE);
			Role role = roleServiceImpl.getRoleByAdmin(admin.getId());
			Operator operator = operatorMapper.selectByPrimaryKey(admin.getOperatorId());
			String operatorName = operator == null ? "" : operator.getName();
			Principal principal = new Principal();
			principal.setId(admin.getId());
			principal.setUsername(username);
			principal.setName(admin.getName());
			principal.setMobile(admin.getMobile());
			principal.setLastLoginTime(lastLoginTime);
			principal.setRole(role);
			principal.setOperatorId(admin.getOperatorId());
			principal.setOperatorName(operatorName);
			return new SimpleAuthenticationInfo(principal, password, getName());
		}
		throw new UnknownAccountException();
	}

	/**
	 * 获取授权信息
	 * @param principals principals
	 * @return 授权信息
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		Principal principal = (Principal) principals.fromRealm(getName()).iterator().next();
		if (principal != null) {
			Set<Authority> modules = moduleServiceImpl.getAdminModule(principal.getId());
			List<String> authorities = new ArrayList<String>();
			if(modules != null && modules.size() > 0){
				for(Authority module : modules){
					authorities.add(module.getAuthority());
				}
			}
			if (modules != null) {
				SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
				authorizationInfo.addStringPermissions(authorities);
				return authorizationInfo;
			}
		}
		return null;
	}

}

猜你喜欢

转载自blog.csdn.net/qq_16855077/article/details/85228712