From c2c10be83a89f59f1d3bf49f9c6928049d9d4ad4 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Fri, 16 Nov 2018 16:56:46 +0800 Subject: [PATCH] =?UTF-8?q?[ADMIN=E7=AB=AF=E9=A2=86=E5=AF=BC=E5=85=8D?= =?UTF-8?q?=E5=AF=86=E7=99=BB=E5=BD=95][=E7=A7=BB=E5=8A=A8=E5=A1=94?= =?UTF-8?q?=E5=8F=B0]:=E9=A2=86=E5=AF=BC=E6=89=8B=E6=9C=BA=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E5=85=8D=E5=AF=86=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/iformall/config/ShiroConfig.java | 21 +++++----- .../iformall/controller/HomeController.java | 8 +++- .../com/iformall/enums/EnumLoginType.java | 38 ++++++++++++++++++ .../shiro/MyRetryLimitCredentialsMatcher.java | 24 ++++++++++++ .../java/com/iformall/shiro/MyShiroRealm.java | 14 ++++--- .../com/iformall/shiro/UseriFormallToken.java | 39 +++++++++++++++++++ 6 files changed, 128 insertions(+), 16 deletions(-) create mode 100644 mallinkAdmin/src/main/java/com/iformall/enums/EnumLoginType.java create mode 100644 mallinkAdmin/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java create mode 100644 mallinkAdmin/src/main/java/com/iformall/shiro/UseriFormallToken.java 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; + } +}