版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
}