Просмотр исходного кода

[ADMIN端领导免密登录][移动塔台]:领导手机授权免密登录

release_toaliyun_real
Stormeye Wu 7 лет назад
Родитель
Сommit
c2c10be83a
6 измененных файлов: 128 добавлений и 16 удалений
  1. +12
    -9
      mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java
  2. +6
    -2
      mallinkAdmin/src/main/java/com/iformall/controller/HomeController.java
  3. +38
    -0
      mallinkAdmin/src/main/java/com/iformall/enums/EnumLoginType.java
  4. +24
    -0
      mallinkAdmin/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java
  5. +9
    -5
      mallinkAdmin/src/main/java/com/iformall/shiro/MyShiroRealm.java
  6. +39
    -0
      mallinkAdmin/src/main/java/com/iformall/shiro/UseriFormallToken.java

+ 12
- 9
mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java Просмотреть файл

@@ -1,8 +1,8 @@
package com.iformall.config;

import com.iformall.service.MallPermissionService;
import com.iformall.shiro.MyRetryLimitCredentialsMatcher;
import com.iformall.shiro.MyShiroRealm;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
@@ -14,6 +14,7 @@ import org.crazycake.shiro.RedisCacheManager;
import org.crazycake.shiro.RedisManager;
import org.crazycake.shiro.RedisSessionDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -81,6 +82,7 @@ public class ShiroConfig {
Map<String, Filter> filters = new LinkedHashMap<String, Filter>();
filters.put("token", new ShiroLoginFilter());
filters.put("corsFilter", new RestFilter());
//filters.put("authc", new MyFormAuthenticationFilter());
shiroFilterFactoryBean.setFilters(filters);
// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
shiroFilterFactoryBean.setLoginUrl("/#/");
@@ -95,6 +97,7 @@ public class ShiroConfig {
//配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
filterChainDefinitionMap.put("/logout", "anon");
filterChainDefinitionMap.put("/doLogin/**", "anon");
filterChainDefinitionMap.put("/bHidLogin/**", "anon");
filterChainDefinitionMap.put("/css/**", "anon");
filterChainDefinitionMap.put("/js/**", "anon");
filterChainDefinitionMap.put("/img/**", "anon");
@@ -146,10 +149,10 @@ public class ShiroConfig {
}

@Bean
public SecurityManager securityManager() {
public SecurityManager securityManager(@Qualifier("myRetryLimitCredentialsMatcher") MyRetryLimitCredentialsMatcher matcher) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//设置realm.
securityManager.setRealm(myShiroRealm());
securityManager.setRealm(myShiroRealm(matcher));
// 自定义缓存实现 使用redis
//securityManager.setCacheManager(cacheManager());
// 自定义session管理 使用redis
@@ -158,24 +161,24 @@ public class ShiroConfig {
}

@Bean
public MyShiroRealm myShiroRealm() {
public MyShiroRealm myShiroRealm(MyRetryLimitCredentialsMatcher matcher) {
MyShiroRealm myShiroRealm = new MyShiroRealm();
myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());
myShiroRealm.setCredentialsMatcher(matcher);
return myShiroRealm;
}


/**
* 凭证匹配器
* 密码匹配凭证管理器 凭证匹配器
* (由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了
* 所以我们需要修改下doGetAuthenticationInfo中的代码;
* )
*
* @return
*/
@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher() {
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
@Bean(name = "myRetryLimitCredentialsMatcher")
public MyRetryLimitCredentialsMatcher hashedCredentialsMatcher() {
MyRetryLimitCredentialsMatcher hashedCredentialsMatcher = new MyRetryLimitCredentialsMatcher();

hashedCredentialsMatcher.setHashAlgorithmName("md5");//散列算法:这里使用MD5算法;
hashedCredentialsMatcher.setHashIterations(2);//散列的次数,比如散列两次,相当于 md5(md5(""));


+ 6
- 2
mallinkAdmin/src/main/java/com/iformall/controller/HomeController.java Просмотреть файл

@@ -14,7 +14,11 @@ import com.iformall.service.MallRolePermissionService;
import com.iformall.service.MallUserInfoService;
import com.iformall.service.MallUserRoleService;
import com.iformall.shiro.UserSession;
<<<<<<< HEAD
import com.iformall.utils.IPUtil;
=======
import com.iformall.shiro.UseriFormallToken;
>>>>>>> [ADMIN端领导免密登录][移动塔台]:领导手机授权免密登录
import com.iformall.utils.ShiroUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -144,7 +148,7 @@ public class HomeController extends BaseController {
ResultData data = new ResultData();
if(StringUtils.isNotBlank(user.getPhone())) {
// 领导登录
user = mallUserInfoService.getByOpenId(user.getOpenId());
user = mallUserInfoService.getByPhone(user.getPhone());
if(!user.getIsAdmin().equals(EnumUserAdmin.ADMIN.getCode())) {
return new ResultData(ErrorCode.USER_NOT_ADMIN);
}
@@ -163,7 +167,7 @@ public class HomeController extends BaseController {

try {
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword());
UseriFormallToken token = new UseriFormallToken(user.getUsername());
subject.login(token);
// List<MallRole> roleList = sysRoleService.findRoleByUserId(user.getId());
// if (null != roleList && roleList.size() > 0) {


+ 38
- 0
mallinkAdmin/src/main/java/com/iformall/enums/EnumLoginType.java Просмотреть файл

@@ -0,0 +1,38 @@
package com.iformall.enums;

/**
* Created by Stormeye on 2018/11/16.
*/
public enum EnumLoginType {

// 0-password, 1-nopassword

PASSWORD(0, "PASSWORD"),
NOPASSWD(1, "NOPASSWORD")
;

public static EnumLoginType getEnum(Integer code) {
for (EnumLoginType value : values()) {
if (value.getCode().equals(code)) {
return value;
}
}
return null;
}

private Integer code;
private String message;

EnumLoginType(Integer code, String message) {
this.code = code;
this.message = message;
}

public Integer getCode() {
return code;
}

public String getMessage() {
return message;
}
}

+ 24
- 0
mallinkAdmin/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java Просмотреть файл

@@ -0,0 +1,24 @@
package com.iformall.shiro;

import com.iformall.enums.EnumLoginType;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyRetryLimitCredentialsMatcher extends HashedCredentialsMatcher {
@Override
public boolean doCredentialsMatch(AuthenticationToken authcToken, AuthenticationInfo info) {
if(authcToken instanceof UseriFormallToken) {
UseriFormallToken tk = (UseriFormallToken) authcToken;
if(tk.getType().equals(EnumLoginType.NOPASSWD)){
return true;
}
boolean matches = super.doCredentialsMatch(authcToken, info);
return matches;
}
boolean matches =super.doCredentialsMatch(authcToken, info);
return matches;
}
}

+ 9
- 5
mallinkAdmin/src/main/java/com/iformall/shiro/MyShiroRealm.java Просмотреть файл

@@ -2,6 +2,7 @@ package com.iformall.shiro;

import javax.annotation.Resource;

import com.iformall.enums.EnumMallUserStatus;
import com.iformall.service.MallUserInfoService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
@@ -51,11 +52,14 @@ public class MyShiroRealm extends AuthorizingRealm {
//获取用户的输入的账号.
String username = (String)token.getPrincipal();
MallUserInfo user = userService.getByUsername(username);
if(user==null) throw new UnknownAccountException("用户名不存在");
// if (0==user.getEnable()) {
// throw new LockedAccountException(); // 帐号锁定
// }
if(user.getStatus()==null || 1!=user.getStatus()) {//用户被禁用
if(user == null) {
throw new UnknownAccountException("用户名不存在");
}
// if (0==user.getEnable()) {
// throw new LockedAccountException(); // 帐号锁定
// }
if(user.getStatus()==null ||
!EnumMallUserStatus.VALID.getCode().equals(user.getStatus())) {//用户被禁用
throw new UnknownAccountException("用户被禁用");
}
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(


+ 39
- 0
mallinkAdmin/src/main/java/com/iformall/shiro/UseriFormallToken.java Просмотреть файл

@@ -0,0 +1,39 @@
package com.iformall.shiro;

import com.iformall.enums.EnumLoginType;
import org.apache.shiro.authc.UsernamePasswordToken;

public class UseriFormallToken extends UsernamePasswordToken {
private static final long serialVersionUID = -2564928913725078138L;

private EnumLoginType type;

public UseriFormallToken() {
super();
}

public UseriFormallToken(String username, String password, EnumLoginType type, boolean rememberMe, String host) {
super(username, password, rememberMe, host);
this.type = type;
}

/** 免密登录 */
public UseriFormallToken(String username) {
super(username, "", false, null);
this.type = EnumLoginType.NOPASSWD;
}
/** 账号密码登录 */
public UseriFormallToken(String username, String pwd) {
super(username, pwd, false, null);
this.type = EnumLoginType.PASSWORD;
}

public EnumLoginType getType() {
return type;
}


public void setType(EnumLoginType type) {
this.type = type;
}
}

Загрузка…
Отмена
Сохранить