diff --git a/mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java b/mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java index 28e569320..4fa507ec5 100644 --- a/mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java +++ b/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 filters = new LinkedHashMap(); 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("")); diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/HomeController.java b/mallinkAdmin/src/main/java/com/iformall/controller/HomeController.java index 1f220c3d9..e3b0a4d63 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/HomeController.java +++ b/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 roleList = sysRoleService.findRoleByUserId(user.getId()); // if (null != roleList && roleList.size() > 0) { diff --git a/mallinkAdmin/src/main/java/com/iformall/enums/EnumLoginType.java b/mallinkAdmin/src/main/java/com/iformall/enums/EnumLoginType.java new file mode 100644 index 000000000..d25d5f607 --- /dev/null +++ b/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; + } +} diff --git a/mallinkAdmin/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java b/mallinkAdmin/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java new file mode 100644 index 000000000..14630d6af --- /dev/null +++ b/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; + } +} diff --git a/mallinkAdmin/src/main/java/com/iformall/shiro/MyShiroRealm.java b/mallinkAdmin/src/main/java/com/iformall/shiro/MyShiroRealm.java index 21f91ea34..67e519c1c 100644 --- a/mallinkAdmin/src/main/java/com/iformall/shiro/MyShiroRealm.java +++ b/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( diff --git a/mallinkAdmin/src/main/java/com/iformall/shiro/UseriFormallToken.java b/mallinkAdmin/src/main/java/com/iformall/shiro/UseriFormallToken.java new file mode 100644 index 000000000..04f525a73 --- /dev/null +++ b/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; + } +}