From 330253f7f1aee08ae21590d4073731cb93aa2be7 Mon Sep 17 00:00:00 2001 From: nh <1311063310@qq.com> Date: Mon, 12 Apr 2021 10:35:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BE=AE=E4=BF=A1=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E6=8E=88=E6=9D=83=E7=99=BB=E5=BD=95=EF=BC=8C?= =?UTF-8?q?=E9=9B=86=E6=88=90shiro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 + wisenergy-common/pom.xml | 20 +- .../config/{ => redis}/RedisConfig.java | 9 +- .../common/config/redis/SerializeUtils.java | 82 +++++ .../expection/BaseExceptionHandler.java | 11 +- .../cn/wisenergy/common/utils/RedisUtil.java | 3 +- .../cn/wisenergy/common/utils/WeChatUtil.java | 69 ++++ .../utils/exception/BASE_RESP_CODE_ENUM.java | 3 +- .../cn/wisenergy/mapper/WorkUserMapper.java | 13 +- .../main/resources/mapper/WorkUserMapper.xml | 26 +- .../wisenergy/model/dto/WeChatUserInfo.java | 33 ++ wisenergy-service/pom.xml | 7 + .../cn/wisenergy/service/WorkUserService.java | 30 +- .../service/impl/WorkProjectServiceImpl.java | 1 + .../service/impl/WorkUserServiceImpl.java | 160 +++++---- wisenergy-shiro/pom.xml | 18 +- .../wisenergy/shiro/config/ShiroConfig.java | 303 ++++++++++++++++++ .../shiro/controller/AuthController.java | 0 .../shiro/controller/BaseController.java | 0 .../shiro/controller/loginController.java | 0 .../shiro/filter/AuthenticationFilter.java | 69 ++++ .../shiro/filter/CustomerLogoutFilter.java | 66 ++++ .../filter/KickoutSessionControlFilter.java | 171 ++++++++++ .../shiro/util/ApplicationContextUtils.java | 83 +++++ .../shiro/util/AuthenticationFilter.java | 275 ++++++++++++++++ .../shiro/util/AuthenticationRealm.java | 184 +++++++++++ .../shiro/util/AuthenticationToken.java | 41 +++ .../shiro/util/AuthorizationFilter.java | 47 +++ .../wisenergy/shiro/util/CustomerRealm.java | 48 +++ .../wisenergy/shiro/util/ExceptionUtil.java | 9 + .../cn/wisenergy/shiro/util/Principal.java | 38 +++ .../shiro/util/ShiroSessionManager.java | 47 +++ .../shiro/util/redis/RedisCache.java | 85 +++++ .../shiro/util/redis/RedisCacheManager.java | 17 + .../shiro/util/redis/RedisSessionDao.java | 94 ++++++ .../shiro/util/redis/ShiroRedisCache.java | 178 ++++++++++ .../util/redis/ShiroRedisCacheManager.java | 59 ++++ .../util/redis/ShiroRedisSessionDAO.java | 129 ++++++++ .../com/project/shiro/config/ShiroConfig.java | 197 ------------ .../shiro/util/AuthenticationFilter.java | 275 ---------------- .../shiro/util/AuthenticationRealm.java | 195 ----------- .../shiro/util/AuthenticationToken.java | 41 --- .../shiro/util/AuthorizationFilter.java | 47 --- .../com/project/shiro/util/Principal.java | 38 --- .../shiro/util/redis/ShiroRedisCache.java | 178 ---------- .../util/redis/ShiroRedisCacheManager.java | 59 ---- .../util/redis/ShiroRedisSessionDAO.java | 129 -------- wisenergy-shiro/wisenergy-shiro.iml | 187 +++++++++++ wisenergy-web-admin/pom.xml | 13 +- .../main/java/cn/wisenergy/Application.java | 5 +- .../controller/app/WorkUserController.java | 42 ++- .../web/config/hanlder/LoginFilter.java | 141 ++++---- 52 files changed, 2656 insertions(+), 1321 deletions(-) rename wisenergy-common/src/main/java/cn/wisenergy/common/config/{ => redis}/RedisConfig.java (89%) create mode 100644 wisenergy-common/src/main/java/cn/wisenergy/common/config/redis/SerializeUtils.java create mode 100644 wisenergy-common/src/main/java/cn/wisenergy/common/utils/WeChatUtil.java create mode 100644 wisenergy-model/src/main/java/cn/wisenergy/model/dto/WeChatUserInfo.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/config/ShiroConfig.java rename wisenergy-shiro/src/main/java/{com/project => cn/wisenergy}/shiro/controller/AuthController.java (100%) rename wisenergy-shiro/src/main/java/{com/project => cn/wisenergy}/shiro/controller/BaseController.java (100%) rename wisenergy-shiro/src/main/java/{com/project => cn/wisenergy}/shiro/controller/loginController.java (100%) create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/filter/AuthenticationFilter.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/filter/CustomerLogoutFilter.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/filter/KickoutSessionControlFilter.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/ApplicationContextUtils.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthenticationFilter.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthenticationRealm.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthenticationToken.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthorizationFilter.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/CustomerRealm.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/ExceptionUtil.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/Principal.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/ShiroSessionManager.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/RedisCache.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/RedisCacheManager.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/RedisSessionDao.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/ShiroRedisCache.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/ShiroRedisCacheManager.java create mode 100644 wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/ShiroRedisSessionDAO.java delete mode 100644 wisenergy-shiro/src/main/java/com/project/shiro/config/ShiroConfig.java delete mode 100644 wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationFilter.java delete mode 100644 wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationRealm.java delete mode 100644 wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationToken.java delete mode 100644 wisenergy-shiro/src/main/java/com/project/shiro/util/AuthorizationFilter.java delete mode 100644 wisenergy-shiro/src/main/java/com/project/shiro/util/Principal.java delete mode 100644 wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisCache.java delete mode 100644 wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisCacheManager.java delete mode 100644 wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisSessionDAO.java create mode 100644 wisenergy-shiro/wisenergy-shiro.iml diff --git a/pom.xml b/pom.xml index 11f0432..182aed6 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,7 @@ <module>wisenergy-model</module> <module>wisenergy-mapper</module> <module>wisenergy-service</module> + <module>wisenergy-shiro</module> <module>wisenergy-web-admin</module> </modules> @@ -36,6 +37,7 @@ <moduleVersion.wisenergy-model>1.0.0-${projectDevMode}</moduleVersion.wisenergy-model> <moduleVersion.wisenergy-mapper>1.0.0-${projectDevMode}</moduleVersion.wisenergy-mapper> <moduleVersion.wisenergy-service>1.0.0-${projectDevMode}</moduleVersion.wisenergy-service> + <moduleVersion.wisenergy-shiro>1.0.0-${projectDevMode}</moduleVersion.wisenergy-shiro> <moduleVersion.wisenergy-web-admin>2.0.0-${projectDevMode}</moduleVersion.wisenergy-web-admin> </properties> diff --git a/wisenergy-common/pom.xml b/wisenergy-common/pom.xml index 12f3d85..c365832 100644 --- a/wisenergy-common/pom.xml +++ b/wisenergy-common/pom.xml @@ -123,16 +123,16 @@ <artifactId>joda-time</artifactId> </dependency> <!-- shiro --> - <dependency> - <groupId>org.apache.shiro</groupId> - <artifactId>shiro-core</artifactId> - <version>1.4.0</version> - </dependency> - <dependency> - <groupId>org.apache.shiro</groupId> - <artifactId>shiro-spring</artifactId> - <version>1.4.0</version> - </dependency> + <!--<dependency>--> + <!--<groupId>org.apache.shiro</groupId>--> + <!--<artifactId>shiro-core</artifactId>--> + <!--<version>1.4.0</version>--> + <!--</dependency>--> + <!--<dependency>--> + <!--<groupId>org.apache.shiro</groupId>--> + <!--<artifactId>shiro-spring</artifactId>--> + <!--<version>1.4.0</version>--> + <!--</dependency>--> <!-- POI --> <dependency> <groupId>org.apache.poi</groupId> diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/config/RedisConfig.java b/wisenergy-common/src/main/java/cn/wisenergy/common/config/redis/RedisConfig.java similarity index 89% rename from wisenergy-common/src/main/java/cn/wisenergy/common/config/RedisConfig.java rename to wisenergy-common/src/main/java/cn/wisenergy/common/config/redis/RedisConfig.java index 584c366..a71068a 100644 --- a/wisenergy-common/src/main/java/cn/wisenergy/common/config/RedisConfig.java +++ b/wisenergy-common/src/main/java/cn/wisenergy/common/config/redis/RedisConfig.java @@ -1,4 +1,4 @@ -package cn.wisenergy.common.config; +package cn.wisenergy.common.config.redis; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -13,16 +13,17 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; */ @Configuration public class RedisConfig { + @Autowired private RedisConnectionFactory factory; - @Bean + @Bean("redisTemplate") public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); - redisTemplate.setHashValueSerializer(new StringRedisSerializer()); - redisTemplate.setValueSerializer(new StringRedisSerializer()); + redisTemplate.setHashValueSerializer(new SerializeUtils()); + redisTemplate.setValueSerializer(new SerializeUtils()); redisTemplate.setConnectionFactory(factory); return redisTemplate; } diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/config/redis/SerializeUtils.java b/wisenergy-common/src/main/java/cn/wisenergy/common/config/redis/SerializeUtils.java new file mode 100644 index 0000000..e38887d --- /dev/null +++ b/wisenergy-common/src/main/java/cn/wisenergy/common/config/redis/SerializeUtils.java @@ -0,0 +1,82 @@ +package cn.wisenergy.common.config.redis; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; + +import java.io.*; + +/** + * @author: nh + * @date: 2021/04/08 + * @description: redisçš„valueåºåˆ—化工具 + */ +public class SerializeUtils implements RedisSerializer { + + private static Logger logger = LoggerFactory.getLogger(SerializeUtils.class); + + public static boolean isEmpty(byte[] data) { + return (data == null || data.length == 0); + } + + /** + * åºåˆ—化 + * + * @param object + * @return + * @throws SerializationException + */ + @Override + public byte[] serialize(Object object) throws SerializationException { + byte[] result = null; + + if (object == null) { + return new byte[0]; + } + try ( + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(128); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteStream) + ) { + + if (!(object instanceof Serializable)) { + throw new IllegalArgumentException(SerializeUtils.class.getSimpleName() + " requires a Serializable payload " + + "but received an object of type [" + object.getClass().getName() + "]"); + } + + objectOutputStream.writeObject(object); + objectOutputStream.flush(); + result = byteStream.toByteArray(); + } catch (Exception ex) { + logger.error("Failed to serialize", ex); + } + return result; + } + + /** + * ååºåˆ—化 + * + * @param bytes + * @return + * @throws SerializationException + */ + @Override + public Object deserialize(byte[] bytes) throws SerializationException { + + Object result = null; + + if (isEmpty(bytes)) { + return null; + } + + try ( + ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes); + ObjectInputStream objectInputStream = new ObjectInputStream(byteStream) + ) { + result = objectInputStream.readObject(); + } catch (Exception e) { + logger.error("Failed to deserialize", e); + } + return result; + } +} \ No newline at end of file diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/expection/BaseExceptionHandler.java b/wisenergy-common/src/main/java/cn/wisenergy/common/expection/BaseExceptionHandler.java index 5f8c376..d128b6e 100644 --- a/wisenergy-common/src/main/java/cn/wisenergy/common/expection/BaseExceptionHandler.java +++ b/wisenergy-common/src/main/java/cn/wisenergy/common/expection/BaseExceptionHandler.java @@ -2,7 +2,6 @@ package cn.wisenergy.common.expection; import cn.wisenergy.common.utils.R; import lombok.extern.slf4j.Slf4j; -import org.apache.shiro.authz.AuthorizationException; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -37,10 +36,10 @@ public class BaseExceptionHandler { return R.error("æ•°æ®åº“ä¸å·²å˜åœ¨è¯¥è®°å½•"); } - @ExceptionHandler(AuthorizationException.class) - public R<?> handleAuthorizationException(AuthorizationException e){ - log.error(e.getMessage(), e); - return R.error("没有æƒé™ï¼Œè¯·è”系管ç†å‘˜æŽˆæƒ"); - } +// @ExceptionHandler(AuthorizationException.class) +// public R<?> handleAuthorizationException(AuthorizationException e){ +// log.error(e.getMessage(), e); +// return R.error("没有æƒé™ï¼Œè¯·è”系管ç†å‘˜æŽˆæƒ"); +// } } diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/RedisUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/RedisUtil.java index 6be32d4..8af1aa3 100644 --- a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/RedisUtil.java +++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/RedisUtil.java @@ -29,7 +29,7 @@ public class RedisUtil { public final static long NOT_EXPIRE = -1; public void set(String key, Object value){ - set(key, value); + valueOperations.set(key, toJson(value)); } public void set(String key, Object value, long expire){ @@ -68,6 +68,7 @@ public class RedisUtil { return redisTemplate.delete(key); } + /** * Object转æˆJSONæ•°æ® */ diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/WeChatUtil.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/WeChatUtil.java new file mode 100644 index 0000000..8955a61 --- /dev/null +++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/WeChatUtil.java @@ -0,0 +1,69 @@ +package cn.wisenergy.common.utils; + +import cn.hutool.core.codec.Base64; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.security.AlgorithmParameters; +import java.security.Security; +import java.util.Arrays; +import java.util.HashMap; + +public class WeChatUtil { + + public static JSONObject getSessionKeyOrOpenId(String code) { + String requestUrl = "https://api.weixin.qq.com/sns/jscode2session"; + HashMap<String, Object> requestUrlParam = new HashMap<>(); + //å°ç¨‹åºappId + requestUrlParam.put("appid", "wx245543a790527cc6"); + //å°ç¨‹åºsecret + requestUrlParam.put("secret", "915b44d0631f7a24c7057ee657ca8a1e"); + //å°ç¨‹åºç«¯è¿”回的code + requestUrlParam.put("js_code", code); + //é»˜è®¤å‚æ•° + requestUrlParam.put("grant_type", "authorization_code"); + //å‘é€post请求读å–调用微信接å£èŽ·å–openidç”¨æˆ·å”¯ä¸€æ ‡è¯† + String result = HttpUtil.get(requestUrl, requestUrlParam); + JSONObject jsonObject = JSONUtil.parseObj(result); + return jsonObject; + } + + public static JSONObject getUserInfo(String encryptedData, String sessionKey, String iv) { + // è¢«åŠ å¯†çš„æ•°æ® + byte[] dataByte = Base64.decode(encryptedData); + // åŠ å¯†ç§˜é’¥ + byte[] keyByte = Base64.decode(sessionKey); + // åç§»é‡ + byte[] ivByte = Base64.decode(iv); + try { + // 如果密钥ä¸è¶³16ä½ï¼Œé‚£ä¹ˆå°±è¡¥è¶³. 这个if ä¸çš„内容很é‡è¦ + int base = 16; + if (keyByte.length % base != 0) { + int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0); + byte[] temp = new byte[groups * base]; + Arrays.fill(temp, (byte) 0); + System.arraycopy(keyByte, 0, temp, 0, keyByte.length); + keyByte = temp; + } + // åˆå§‹åŒ– + Security.addProvider(new BouncyCastleProvider()); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); + SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); + AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES"); + parameters.init(new IvParameterSpec(ivByte)); + // åˆå§‹åŒ– + cipher.init(Cipher.DECRYPT_MODE, spec, parameters); + byte[] resultByte = cipher.doFinal(dataByte); + if (null != resultByte && resultByte.length > 0) { + String result = new String(resultByte, "UTF-8"); + return JSONUtil.parseObj(result); + } + } catch (Exception e) { + } + return null; + } +} \ No newline at end of file diff --git a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exception/BASE_RESP_CODE_ENUM.java b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exception/BASE_RESP_CODE_ENUM.java index 8d7bc0a..9ce9be9 100644 --- a/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exception/BASE_RESP_CODE_ENUM.java +++ b/wisenergy-common/src/main/java/cn/wisenergy/common/utils/exception/BASE_RESP_CODE_ENUM.java @@ -87,7 +87,8 @@ public enum BASE_RESP_CODE_ENUM { PLEASE_CANCELTHE_MANAGEMENTROLE("669", "注销账å·ï¼Œè¯·å–消管ç†è§’色"), ATLEASTONEADMINISTRATORISREQUIRED("670", "至少需è¦ä¸€ä¸ªç³»ç»Ÿç®¡ç†å‘˜ï¼"), PLEASESELECTANITEM("671", "请选择一个项目"), - PLEASESELECTADEPARTMENT("672","请选择一个部门") + PLEASESELECTADEPARTMENT("672","请选择一个部门"), + WECHAT_NOT_BIND("673","微信未绑定") ; diff --git a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/WorkUserMapper.java b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/WorkUserMapper.java index daf2bbc..893530c 100644 --- a/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/WorkUserMapper.java +++ b/wisenergy-mapper/src/main/java/cn/wisenergy/mapper/WorkUserMapper.java @@ -32,7 +32,7 @@ public interface WorkUserMapper extends BaseMapper<WorkUser> { */ WorkUser getUserById(Integer userId); - Integer updateUserInfo(WorkUser user); + int updateUserInfo(WorkUser user); /** * 获å–用户主键ã€å§“åã€éƒ¨é—¨åç§° @@ -46,7 +46,16 @@ public interface WorkUserMapper extends BaseMapper<WorkUser> { List<WorkRole> getUserRole(Integer id); - int updateStatusAndSubmitOrderById(@Param("userId") Integer userId,@Param("status") Integer status,@Param("submitOrder")Integer submitOrder); + WorkUser getUserByLoginName(String loginName); + + /** + * æ ¹æ®openid查询用户 + * @param openid + * @return + */ + WorkUser getUserByOpenId(String openid); + + int clearOpenidByUserId(Integer userId); } diff --git a/wisenergy-mapper/src/main/resources/mapper/WorkUserMapper.xml b/wisenergy-mapper/src/main/resources/mapper/WorkUserMapper.xml index 3ad15e6..60f795f 100644 --- a/wisenergy-mapper/src/main/resources/mapper/WorkUserMapper.xml +++ b/wisenergy-mapper/src/main/resources/mapper/WorkUserMapper.xml @@ -33,7 +33,7 @@ </sql> <sql id="cols_exclude_id"> - name, oa_user_id, login_name, phone, dept_id, email, role ,type,status,wx_id,submit_order,create_time,modify_time + name, oa_user_id, login_name, phone, password, dept_id, email, role ,type,status,wx_id,submit_order,create_time,modify_time </sql> <sql id="values"> @@ -87,6 +87,7 @@ from <include refid="table"/> where id = #{userId} </select> + <select id="getStatisticsTableDtos" resultType="cn.wisenergy.model.dto.StatisticsTableDto"> select u.id AS user_id, u.name AS user_name, d.dept_name from work_user u join work_dept d on u.dept_id=d.id @@ -102,6 +103,7 @@ set <include refid="updateCondition"/> where id = #{id} </update> + <update id="updateStatusAndSubmitOrderById"> update <include refid="table"/> <set> @@ -115,6 +117,12 @@ where id = #{userId} </update> + <update id="clearOpenidByUserId"> + update <include refid="table"/> + set wx_id = null + where id = #{userId} + </update> + <resultMap id="UserRoleMap" type="cn.wisenergy.model.dto.UserRoleDto"> <id column="id" property="id"/> @@ -171,4 +179,20 @@ LEFT JOIN work_role r on ur.role_id = r.id ORDER BY CONVERT( `name` USING gbk ) </select> + <select id="getUserByLoginName" resultType="cn.wisenergy.model.app.WorkUser"> + select <include refid="cols_all"/> + from <include refid="table"/> + <where> + login_name = #{loginName} + </where> + </select> + + <select id="getUserByOpenId" resultType="cn.wisenergy.model.app.WorkUser"> + select <include refid="cols_all"/> + from <include refid="table"/> + <where> + wx_id = #{openid} + </where> + </select> + </mapper> diff --git a/wisenergy-model/src/main/java/cn/wisenergy/model/dto/WeChatUserInfo.java b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/WeChatUserInfo.java new file mode 100644 index 0000000..af7d307 --- /dev/null +++ b/wisenergy-model/src/main/java/cn/wisenergy/model/dto/WeChatUserInfo.java @@ -0,0 +1,33 @@ +package cn.wisenergy.model.dto; + +import lombok.Data; + +@Data +public class WeChatUserInfo { + /** + * 微信返回的code + */ + private String code; + +// private String + + + + /** + * éžæ•æ„Ÿçš„ç”¨æˆ·ä¿¡æ¯ + */ +// private String rawData; + /** + * ç¾åä¿¡æ¯ + */ +// private String signature; + /** + * åŠ å¯†çš„æ•°æ® + */ +// private String encrypteData; + /** + * åŠ å¯†å¯†é’¥ + */ +// private String iv; + +} \ No newline at end of file diff --git a/wisenergy-service/pom.xml b/wisenergy-service/pom.xml index 735b720..034c978 100644 --- a/wisenergy-service/pom.xml +++ b/wisenergy-service/pom.xml @@ -26,6 +26,13 @@ <artifactId>wisenergy-mapper</artifactId> <version>${moduleVersion.wisenergy-mapper}</version> </dependency> + + <dependency> + <groupId>cn.wisenergy</groupId> + <artifactId>wisenergy-shiro</artifactId> + <version>${moduleVersion.wisenergy-shiro}</version> + </dependency> + <!--综åˆå®‰é˜²ç®¡ç†å¹³å°æä¾›äº†OpenAPI安全认è¯åº“(Javaã€C++)快速实现接å£è°ƒç”¨ã€‚--> <dependency> <groupId>com.hikvision.ga</groupId> diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/WorkUserService.java b/wisenergy-service/src/main/java/cn/wisenergy/service/WorkUserService.java index a29581d..1b91efc 100644 --- a/wisenergy-service/src/main/java/cn/wisenergy/service/WorkUserService.java +++ b/wisenergy-service/src/main/java/cn/wisenergy/service/WorkUserService.java @@ -1,13 +1,9 @@ package cn.wisenergy.service; import cn.wisenergy.model.app.WorkUser; -import cn.wisenergy.model.dto.AllRoleAndUserRoleDto; -import cn.wisenergy.model.dto.OrganizationDto; -import cn.wisenergy.model.dto.OrganizationStructureDto; -import cn.wisenergy.model.dto.ResultUser; +import cn.wisenergy.model.dto.*; import cn.wisenergy.model.vo.GetUserListVo; -import javax.servlet.http.HttpServletRequest; import java.util.List; import java.util.Map; @@ -27,10 +23,9 @@ public interface WorkUserService { * @param loginName 登录å * @param password 密ç * @param source ç™»å½•æ¥æº - * @param request * @return */ - ResultUser login(String loginName, String password, String source, HttpServletRequest request); + ResultUser login(String loginName, String password, String source); /** * 获å–ç”¨æˆ·åŸºç¡€ä¿¡æ¯ @@ -69,4 +64,25 @@ public interface WorkUserService { Boolean reSetPassword(Integer userId); List<WorkUser> getByMap(Map<String, Object> map); + + /** + * 微信登录 + * @param code + * @return + */ + ResultUser weChatLogin( String code); + + /** + * 绑定用户和微信登录 + * @param userId + * @param code + * @return + */ + boolean bindWeChat(Integer userId, String code); + + /** + * 微信登录处ç†ï¼Œå°†æ•°æ®åº“ä¸çš„wx_idä¸å˜å‚¨çš„openid置为null + * @param userId + */ + void wxLogout(Integer userId); } diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/impl/WorkProjectServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/impl/WorkProjectServiceImpl.java index 9a02754..73e2d4b 100644 --- a/wisenergy-service/src/main/java/cn/wisenergy/service/impl/WorkProjectServiceImpl.java +++ b/wisenergy-service/src/main/java/cn/wisenergy/service/impl/WorkProjectServiceImpl.java @@ -605,6 +605,7 @@ public class WorkProjectServiceImpl implements WorkProjectService { return insert1 > 0; } + private OrderChangeDto getProjevtAndTypeOfDept(Integer userId, Boolean isFillIn, Boolean addProjectOfDept) { if (null == userId) { throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL); diff --git a/wisenergy-service/src/main/java/cn/wisenergy/service/impl/WorkUserServiceImpl.java b/wisenergy-service/src/main/java/cn/wisenergy/service/impl/WorkUserServiceImpl.java index d029601..fe36d5b 100644 --- a/wisenergy-service/src/main/java/cn/wisenergy/service/impl/WorkUserServiceImpl.java +++ b/wisenergy-service/src/main/java/cn/wisenergy/service/impl/WorkUserServiceImpl.java @@ -1,7 +1,9 @@ package cn.wisenergy.service.impl; +import cn.hutool.json.JSONObject; import cn.wisenergy.common.utils.Md5Util; +import cn.wisenergy.common.utils.WeChatUtil; import cn.wisenergy.common.utils.exception.BASE_RESP_CODE_ENUM; import cn.wisenergy.common.utils.exception.BaseCustomException; import cn.wisenergy.mapper.WorkRoleMapper; @@ -17,21 +19,25 @@ import cn.wisenergy.service.WorkDeptService; import cn.wisenergy.service.WorkSubmitAdoptService; import cn.wisenergy.service.WorkUserService; import cn.wisenergy.service.utils.UserRoleLevelUtils; +import cn.wisenergy.shiro.filter.KickoutSessionControlFilter; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanutils.BeanUtils; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.IncorrectCredentialsException; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; import java.util.*; /** @@ -68,6 +74,8 @@ public class WorkUserServiceImpl implements WorkUserService { // 用户在èŒçжæ€ç private static final Integer ON_THE_JOB_STATUS = 1; + @Autowired + private KickoutSessionControlFilter kickoutSessionControlFilter; @Override public WorkUser getById(Integer id) { @@ -97,11 +105,10 @@ public class WorkUserServiceImpl implements WorkUserService { @Override public ResultUser changePassword(Integer userId, String oldPassword, String newPassword) { - log.info("WorkUserServiceImpl[]changePassword[]input.param{}" + userId + oldPassword + newPassword); + log.info("WorkUserServiceImpl[]changePassword[]input.param{}" + userId + "," + oldPassword + "," + newPassword); if (userId == null || StringUtils.isEmpty(oldPassword) || StringUtils.isEmpty(newPassword)) { throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL); } - //新密ç 与旧密ç ç›¸åŒ if (oldPassword.equals(newPassword)) { throw new BaseCustomException(BASE_RESP_CODE_ENUM.NEW_PASSWORD_IS_HTE_SAME_OLD_PASSWORD); @@ -241,7 +248,7 @@ public class WorkUserServiceImpl implements WorkUserService { int DeptUpdateIndex = 0; int centreUpdateIndex = 0; - if (!CollectionUtils.isEmpty(roles) && 1==workUser.getStatus()) { + if (!CollectionUtils.isEmpty(roles) && 1 == workUser.getStatus()) { for (Integer role : roles) { // 部门ç»ç† if (2 == role) { @@ -325,22 +332,91 @@ public class WorkUserServiceImpl implements WorkUserService { } @Override - public ResultUser login(String loginName, String password, String source, HttpServletRequest request) { + public ResultUser weChatLogin(String code) { + // 2.å¼€å‘者æœåС噍 登录å‡è¯æ ¡éªŒæŽ¥å£ appId + appSecret + 接收å°ç¨‹åºå‘é€çš„code + JSONObject SessionKeyOpenId = WeChatUtil.getSessionKeyOrOpenId(code); + // 3.æŽ¥æ”¶å¾®ä¿¡æŽ¥å£æœåŠ¡ 获å–è¿”å›žçš„å‚æ•° + String openid = SessionKeyOpenId.get("openid", String.class); + if (StringUtils.isEmpty(openid)) { + throw new BaseCustomException(BASE_RESP_CODE_ENUM.WECHAT_NOT_BIND); + } + + // 5.æ ¹æ®è¿”回的User实体类,判æ–用户是å¦å˜åœ¨ + WorkUser user = workUserMapper.getUserByOpenId(openid); + if (user == null) { + throw new BaseCustomException(BASE_RESP_CODE_ENUM.WECHAT_NOT_BIND); + } + // 调用shiro登录 +// UsernamePasswordToken token = new UsernamePasswordToken(user.getLoginName(), user.getPassword()); + + + List<Integer> roles = UserRoleLevelUtils.getRole(user.getId()); + // é™åˆ¶å®¡æ ¸çš„天数 + WorkSubmitAdopt byId = workSubmitAdoptService.getById(1); + + ResultUser resultUser = getResultUser(user, byId, roles); + return resultUser; + } + + @Override + public boolean bindWeChat(Integer userId, String code) { + log.info("WorkUserServiceImpl[]bindWeChat[]input.param{}userName,code" + userId + "," + code); + if (userId == null || StringUtils.isEmpty(code)) { + throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL); + } + // 获å–ç”¨æˆ·ä¿¡æ¯ + WorkUser userById = workUserMapper.getUserById(userId); + // 获å–openid + JSONObject SessionKeyOpenId = WeChatUtil.getSessionKeyOrOpenId(code); + String openid = SessionKeyOpenId.get("openid", String.class); + // 将用户与openid绑定 + userById.setWxId(openid); + int integer = workUserMapper.updateUserInfo(userById); + if (integer == 0) { + throw new BaseCustomException(BASE_RESP_CODE_ENUM.UPDATE_DATA_FAIL); + } + return true; + } + + @Override + public void wxLogout(Integer userId) { + log.info("WorkUserServiceImpl[]wxLogout[]input.param{}userId" + userId); + int update = workUserMapper.clearOpenidByUserId(userId); + if (update == 0) { + throw new BaseCustomException(BASE_RESP_CODE_ENUM.UPDATE_DATA_FAIL); + } + log.info("WorkUserServiceImpl[]wxLogout[]" + userId + "退出"); + } + + @Override + public ResultUser login(String loginName, String password, String source) { log.info("WorkUserServiceImpl[]login[].input.param" + loginName + password + source); if (StringUtils.isEmpty(loginName) || StringUtils.isEmpty(password)) { throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL); } - //MD5åŠ å¯† - String md5Password = Md5Util.digestMD5(password); - - HashMap<String, Object> map = new HashMap<>(); - map.put("loginName", loginName); - map.put("password", md5Password); - WorkUser user = workUserMapper.getUserInfo(map); - if (null == user) { + // shiroéªŒè¯ + Subject subject = SecurityUtils.getSubject(); + UsernamePasswordToken token = new UsernamePasswordToken(loginName, password); + WorkUser user = null; + try { + // shiroç™»å½•å¤„ç† + subject.login(token); + // ç”¨æˆ·ä¿¡æ¯ + user = (WorkUser) subject.getPrincipal(); + // 登录请求ä¸è¿›å…¥è‡ªå®šä¹‰shiroæ‹¦æˆªå™¨ï¼Œåœ¨è¿™é‡Œè¿›è¡Œä¸€æ¬¡ï¼Œç»Ÿä¸€è´¦æˆ·å¤šç™»å½•è¸¢å‡ºå¤„ç† + kickoutSessionControlFilter.getSessionQue(subject.getSession(), user.getId()); + } catch (IncorrectCredentialsException e) { + e.printStackTrace(); + throw new BaseCustomException(BASE_RESP_CODE_ENUM.USER_LOGIN_NAME_OR_PASSWORD_IS_ERROR); + } catch (UnknownAccountException e) { + e.printStackTrace(); throw new BaseCustomException(BASE_RESP_CODE_ENUM.USER_LOGIN_NAME_OR_PASSWORD_IS_ERROR); + } catch (AuthenticationException e) { + e.printStackTrace(); + throw new BaseCustomException(BASE_RESP_CODE_ENUM.NO_AUTH_REQUEST); } - // 是å¦ç¦»èŒçŠ¶æ€ + + // 是å¦ç¦»èŒçжæ€ï¼ŒæŠ›å‡ºå¼‚常 if (!user.getStatus().equals(ON_THE_JOB_STATUS)) { throw new BaseCustomException(BASE_RESP_CODE_ENUM.LEAVE_JOB_USER); } @@ -351,49 +427,13 @@ public class WorkUserServiceImpl implements WorkUserService { if (roles.contains(ManagerEnum.NOT_MANAGER.getCode())) { throw new BaseCustomException(BASE_RESP_CODE_ENUM.THE_USER_NOT_MANAGER_PLASE_MANAGER_LOGIN); } - // é™åˆ¶å•设备登录 - HttpSession session = request.getSession(); - ServletContext application = session.getServletContext(); - // 获å–å˜å‚¨ç™»å½• - Map<String, String> loginMap = (Map<String, String>) application.getAttribute("loginMap"); - Map<String, HttpSession> sessionMap = (Map<String, HttpSession>) application.getAttribute("sessionMap"); - String id = String.valueOf(user.getId()); - - if (loginMap == null) { - loginMap = new HashMap<>(); - sessionMap = new HashMap<>(); - } - - if (loginMap.get(id) == null) { - loginMap.put(id, session.getId()); - System.out.println("session.getId() = " + session.getId()); - sessionMap.put(session.getId(), session); - System.out.println("session = " + session); - } else { - String sessionId = loginMap.get(id); //æ ¹æ®id获å–上一个用户的sessionId - HttpSession oldSession = sessionMap.get(sessionId); //æ ¹æ®sessionId获å–上一个用户的session - oldSession.invalidate(); - sessionMap.remove(oldSession.getId()); //æ ¹æ®sessionIdåˆ é™¤æ—§session - sessionMap.put(session.getId(), session); - loginMap.remove(id); //移除idå’ŒoldSession对应关系 - loginMap.put(id, session.getId()); //æ·»åŠ æ–°çš„idå’ŒoldSession对应关系 - } - application.setAttribute("loginMap", loginMap); // æ·»åŠ ä¸¤ä¸ªHashMap到Application,é‡è¦ - application.setAttribute("sessionMap", sessionMap); - } + // é™åˆ¶å®¡æ ¸çš„天数 WorkSubmitAdopt byId = workSubmitAdoptService.getById(1); //将用户对象转æ¢ä¸ºdto - ResultUser resultUser = getResultUser(user); - resultUser.setDay(byId.getSubmitTime()); - List<Integer> levelIds = UserRoleLevelUtils.getlevelIds(roles); - List<WorkLevel> workLevels = UserRoleLevelUtils.getlevelByIds(levelIds); - if (!CollectionUtils.isEmpty(workLevels)) { - Collections.sort(workLevels); - resultUser.setWorkLevels(workLevels); - } + ResultUser resultUser = getResultUser(user, byId, roles); return resultUser; } @@ -436,4 +476,16 @@ public class WorkUserServiceImpl implements WorkUserService { return userDto; } + private ResultUser getResultUser(WorkUser workUser, WorkSubmitAdopt workSubmitAdopt, List<Integer> roles) { + ResultUser resultUser = getResultUser(workUser); + resultUser.setDay(workSubmitAdopt.getSubmitTime()); + List<Integer> levelIds = UserRoleLevelUtils.getlevelIds(roles); + List<WorkLevel> workLevels = UserRoleLevelUtils.getlevelByIds(levelIds); + if (!CollectionUtils.isEmpty(workLevels)) { + Collections.sort(workLevels); + resultUser.setWorkLevels(workLevels); + } + return resultUser; + } + } diff --git a/wisenergy-shiro/pom.xml b/wisenergy-shiro/pom.xml index 1aecd0d..2bb85be 100644 --- a/wisenergy-shiro/pom.xml +++ b/wisenergy-shiro/pom.xml @@ -3,12 +3,15 @@ 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> + <parent> <artifactId>wisenergy-parent</artifactId> - <groupId>org.yun</groupId> + <groupId>cn.wisenergy</groupId> <version>1.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> + + <artifactId>wisenergy-shiro</artifactId> <version>${moduleVersion.wisenergy-shiro}</version> <packaging>jar</packaging> @@ -17,19 +20,22 @@ <dependencies> <!-- 模å—ä¾èµ– --> <dependency> - <groupId>org.yun</groupId> - <artifactId>wisenergy-service</artifactId> - <version>${moduleVersion.wisenergy-service}</version> + <groupId>cn.wisenergy</groupId> + <artifactId>wisenergy-mapper</artifactId> + <version>${moduleVersion.wisenergy-mapper}</version> </dependency> + + <!-- Shiro --> <dependency> <groupId>org.apache.shiro</groupId> - <artifactId>shiro-spring-boot-web-starter</artifactId> + <artifactId>shiro-spring-boot-starter</artifactId> + <version>1.4.1</version> </dependency> </dependencies> <!-- MAVEN构建 --> <build> - <finalName>${project.artifactId}-${moduleVersion.project-shiro}</finalName> + <finalName>${project.artifactId}-${moduleVersion.wisenergy-shiro}</finalName> </build> </project> \ No newline at end of file diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/config/ShiroConfig.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/config/ShiroConfig.java new file mode 100644 index 0000000..fc5791a --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/config/ShiroConfig.java @@ -0,0 +1,303 @@ +package cn.wisenergy.shiro.config; + +import cn.wisenergy.shiro.filter.CustomerLogoutFilter; +import cn.wisenergy.shiro.filter.KickoutSessionControlFilter; +import cn.wisenergy.shiro.util.CustomerRealm; +import cn.wisenergy.shiro.util.ShiroSessionManager; +import cn.wisenergy.shiro.util.redis.RedisCacheManager; +import cn.wisenergy.shiro.util.redis.RedisSessionDao; +import org.apache.shiro.authc.credential.HashedCredentialsMatcher; +import org.apache.shiro.mgt.DefaultSecurityManager; +import org.apache.shiro.realm.Realm; +import org.apache.shiro.session.mgt.SessionManager; +import org.apache.shiro.session.mgt.eis.SessionDAO; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.apache.shiro.web.servlet.SimpleCookie; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.servlet.Filter; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Description: shiroé…置类 + * User: mxy + * Date: 2019-04-16 + */ +@Configuration +public class ShiroConfig { + + private static final transient Logger logger = LoggerFactory.getLogger(ShiroConfig.class); + + /** + * é…置拦截器 + * <p> + * 定义拦截URLæƒé™ï¼Œä¼˜å…ˆçº§ä»Žä¸Šåˆ°ä¸‹ + * 1). anon : 匿åè®¿é—®ï¼Œæ— éœ€ç™»å½• + * 2). authc : ç™»å½•åŽæ‰èƒ½è®¿é—® + * 3). logout: 登出 + * 4). frameperms : 自定义的过滤器 + * <p> + * URL 匹é…é£Žæ ¼ + * 1). ?:匹é…一个å—符,如 /admin? å°†åŒ¹é… /admin1,但ä¸åŒ¹é… /admin 或 /admin/ï¼› + * 2). *:匹é…零个或多个å—符串,如 /admin* å°†åŒ¹é… /admin 或/admin123,但ä¸åŒ¹é… /admin/1ï¼› + * 3). **:匹é…路径ä¸çš„零个或多个路径,如 /admin/** å°†åŒ¹é… /admin/a 或 /admin/a/b + * <p> + * é…ç½®èº«ä»½éªŒè¯æˆåŠŸï¼Œå¤±è´¥çš„è·³è½¬è·¯å¾„ + */ + + @Bean + public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultSecurityManager securityManager){ + logger.info("进入Shiro拦截工厂"); + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + + // ç»™shiroFilterFactoryBean设置安全管ç†å™¨ + shiroFilterFactoryBean.setSecurityManager(securityManager); + + // 自定义过滤器 + Map<String, Filter> filterMap = new LinkedHashMap<>(); + filterMap.put("kickout", kickoutSessionControlFilter()); + filterMap.put("wxLogout", customerLogoutFilter()); + shiroFilterFactoryBean.setFilters(filterMap); + // é…置系统公共å—é™èµ„æºå’Œå…¬å…±èµ„æº + LinkedHashMap<String, String> map = new LinkedHashMap<>(); + + map.put("/login", "anon"); + map.put("/swagger-ui.html","anon"); + map.put("/swagger/**","anon"); + map.put("/webjars/**", "anon"); + map.put("/swagger-resources/**","anon"); + map.put("/v2/**","anon"); + map.put("/static/**", "anon"); + map.put("/**", "kickout"); + map.put("/wxLogout", "wxLogout"); + shiroFilterFactoryBean.setFilterChainDefinitionMap(map); + + // 未登录返回 +// shiroFilterFactoryBean.setLoginUrl("/unLogin"); + return shiroFilterFactoryBean; + } + + @Bean(name = "securityManager") + public DefaultWebSecurityManager getDefaultSecurityManager(@Qualifier("realm") Realm realm) { + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + securityManager.setRealm(realm); + securityManager.setSessionManager(sessionManager()); + return securityManager; + } + + @Bean(name = "realm") + public Realm getRealm(){ + CustomerRealm customerRealm = new CustomerRealm(); + // å‡è¯æ ¡éªŒåŒ¹é…器 + HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); + // è®¾ç½®åŠ å¯†ç®—æ³•ä¸ºMD5 + hashedCredentialsMatcher.setHashAlgorithmName("MD5"); + hashedCredentialsMatcher.setHashIterations(1); + // 设置realmçš„å‡è¯æ ¡éªŒå™¨ + customerRealm.setCredentialsMatcher(hashedCredentialsMatcher); + + // å…¨å±€ç¼“å˜ + customerRealm.setCacheManager(new RedisCacheManager()); + customerRealm.setCachingEnabled(true); + + // å¼€å¯è®¤è¯ç¼“å˜ç®¡ç† + customerRealm.setAuthenticationCachingEnabled(true); + // 认è¯ç¼“å˜çš„åç§° + customerRealm.setAuthenticationCacheName("AuthenticationRedisCache"); + return customerRealm; + } + + @Bean + public SessionManager sessionManager(){ + ShiroSessionManager sessionManager = new ShiroSessionManager(); + sessionManager.setSessionIdCookie(simpleCookie()); + sessionManager.setSessionDAO(sessionDAO()); + return sessionManager; + } + + @Bean + public SessionDAO sessionDAO(){ + RedisSessionDao redisSessionDao = new RedisSessionDao(); + return redisSessionDao; + } + + @Bean + public SimpleCookie simpleCookie(){ + SimpleCookie sharejsessionid = new SimpleCookie("SHAREJSESSIONID"); + sharejsessionid.setHttpOnly(false); + return sharejsessionid; + } + + + /** + * å¹¶å‘登录控制,é™åˆ¶ç™»å½•人数为1 + */ + @Bean("kickout") + public KickoutSessionControlFilter kickoutSessionControlFilter(){ + KickoutSessionControlFilter kickoutSessionControlFilter = new KickoutSessionControlFilter(); + kickoutSessionControlFilter.setSessionManager(sessionManager()); + return kickoutSessionControlFilter; + } + + @Bean("wxLogout") + public CustomerLogoutFilter customerLogoutFilter(){ + CustomerLogoutFilter customerLogoutFilter = new CustomerLogoutFilter(); + return customerLogoutFilter; + } + + + + + +// @Bean +// public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager) { +// logger.info("进入Shiro拦截工厂"); +// ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); +// // 设置securityManager +// shiroFilterFactoryBean.setSecurityManager(securityManager); +// +// // 自定义的过滤器 +// Map<String, Filter> filterMap = new HashMap<>(); +// // map里é¢key值è¦ä¸ºè¿‡æ»¤å™¨çš„å称,value为过滤器对象 +// filterMap.put("authc", authenticationFilter()); +// filterMap.put("frameperms", authorizationFilter()); +// // å°†è‡ªå®šä¹‰çš„è¿‡æ»¤å™¨åŠ å…¥åˆ°è¿‡æ»¤å™¨é›†åˆä¸ +// shiroFilterFactoryBean.setFilters(filterMap); +// +// // è®¾ç½®æ‹¦æˆªå™¨é›†åˆ +// Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>(); +//// filterChainDefinitionMap.put("/admin/", "anon"); // åŽå°èµ„æº-匿å访问 +//// filterChainDefinitionMap.put("/admin/res/**", "anon"); // 陿€èµ„æº-匿å访问 +//// filterChainDefinitionMap.put("/admin/anon/**", "anon"); // åŽå°å¯åŒ¿å访问资æº-匿å访问 +//// filterChainDefinitionMap.put("/admin/login", "authc"); // 登录页é¢-èº«ä»½è®¤è¯ +// filterChainDefinitionMap.put("/getUserInfo", "authc"); +//// filterChainDefinitionMap.put("/admin/logout", "logout"); // 用户退出,åªéœ€é…ç½®logoutå³å¯å®žçŽ°è¯¥åŠŸèƒ½ +//// filterChainDefinitionMap.put("/admin/common/**", "anon"); // 其他路径å‡éœ€è¦èº«ä»½è®¤è¯ï¼Œä¸€èˆ¬ä½äºŽæœ€ä¸‹é¢ï¼Œä¼˜å…ˆçº§æœ€ä½Ž +//// filterChainDefinitionMap.put("/admin/**", "authc,frameperms"); // 其他路径å‡éœ€è¦èº«ä»½è®¤è¯ï¼Œä¸€èˆ¬ä½äºŽæœ€ä¸‹é¢ï¼Œä¼˜å…ˆçº§æœ€ä½Ž +// +// // 设置拦截器 +// shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); +// shiroFilterFactoryBean.setLoginUrl("/login"); // 登录的路径 +//// shiroFilterFactoryBean.setUnauthorizedUrl("/admin/common/unauthorized.jhtml"); // 验è¯å¤±è´¥åŽè·³è½¬çš„路径 +// logger.info("Shiro拦截工厂é…置完æˆ"); +// return shiroFilterFactoryBean; +// } +// +// /** +// * é…ç½®Shiro生命周期处ç†å™¨ +// */ +// @Bean +// public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { +// return new LifecycleBeanPostProcessor(); +// } +// +// /** +// * 自动创建代ç†ç±»ï¼Œè‹¥ä¸æ·»åŠ ï¼ŒShiro的注解å¯èƒ½ä¸ä¼šç”Ÿæ•ˆã€‚ +// */ +// @Bean +// @DependsOn({"lifecycleBeanPostProcessor"}) +// public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() { +// DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); +// advisorAutoProxyCreator.setProxyTargetClass(true); +// return advisorAutoProxyCreator; +// } +// +// /** +// * å¼€å¯Shiro的注解 +// */ +// @Bean +// public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() { +// AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); +// authorizationAttributeSourceAdvisor.setSecurityManager(securityManager()); +// return authorizationAttributeSourceAdvisor; +// } +// +// /** +// * é…ç½®åŠ å¯†åŒ¹é…,使用MD5的方å¼ï¼Œè¿›è¡Œ1024æ¬¡åŠ å¯† +// */ +//// @Bean +//// public HashedCredentialsMatcher hashedCredentialsMatcher() { +//// HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); +//// hashedCredentialsMatcher.setHashAlgorithmName("MD5"); +//// hashedCredentialsMatcher.setHashIterations(1024); +//// return hashedCredentialsMatcher; +//// } +// +// /** +// * SecurityManager 安全管ç†å™¨ï¼›Shiroçš„æ ¸å¿ƒ +// */ +// @Bean +// public DefaultWebSecurityManager securityManager() { +// DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); +// // 自定义的Realm +// securityManager.setRealm(authenticationShiroRealm()); +// // 缓å˜ç®¡ç† +// securityManager.setCacheManager(shiroRedisCacheManager()); +// // 会è¯ç®¡ç† +// securityManager.setSessionManager(sessionManager()); +// return securityManager; +// } +// +// /** +// * 自定义Realm,å¯ä»¥å¤šä¸ª +// */ +// @Bean +// public AuthenticationRealm authenticationShiroRealm() { +// AuthenticationRealm authenticationRealm = new AuthenticationRealm(); +// //authenticationRealm.setCredentialsMatcher(hashedCredentialsMatcher()); +// return authenticationRealm; +// } +// +//// /** +//// * redis缓å˜ç®¡ç† +//// */ +// @Bean +// public ShiroRedisCacheManager shiroRedisCacheManager() { +// return new ShiroRedisCacheManager(); +// } +// +// /** +// * 设置session会è¯ç®¡ç†è€… +// */ +// @Bean +// public SessionManager sessionManager() { +// DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager(); +// defaultWebSessionManager.setSessionIdCookie(simpleCookie()); +// defaultWebSessionManager.setSessionDAO(shiroRedisSessionDAO()); +// return defaultWebSessionManager; +// } +// +// /** +// * sessionç®¡ç† +// */ +// @Bean +// public ShiroRedisSessionDAO shiroRedisSessionDAO() { +// return new ShiroRedisSessionDAO(); +// } +// +// /** +// * 这里需è¦è®¾ç½®ä¸€ä¸ªcookieçš„åç§° åŽŸå› å°±æ˜¯ä¼šè·ŸåŽŸæ¥çš„sessionçš„id值é‡å¤çš„ +// */ +// @Bean +// public SimpleCookie simpleCookie() { +// return new SimpleCookie("SHAREJSESSIONID"); +// } +// +// +// @Bean +// public AuthenticationFilter authenticationFilter() { +// return new AuthenticationFilter(); +// } +// +// @Bean +// public AuthorizationFilter authorizationFilter() { +// return new AuthorizationFilter(); +// } + +} diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/controller/AuthController.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/controller/AuthController.java similarity index 100% rename from wisenergy-shiro/src/main/java/com/project/shiro/controller/AuthController.java rename to wisenergy-shiro/src/main/java/cn/wisenergy/shiro/controller/AuthController.java diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/controller/BaseController.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/controller/BaseController.java similarity index 100% rename from wisenergy-shiro/src/main/java/com/project/shiro/controller/BaseController.java rename to wisenergy-shiro/src/main/java/cn/wisenergy/shiro/controller/BaseController.java diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/controller/loginController.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/controller/loginController.java similarity index 100% rename from wisenergy-shiro/src/main/java/com/project/shiro/controller/loginController.java rename to wisenergy-shiro/src/main/java/cn/wisenergy/shiro/controller/loginController.java diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/filter/AuthenticationFilter.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/filter/AuthenticationFilter.java new file mode 100644 index 0000000..4208468 --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/filter/AuthenticationFilter.java @@ -0,0 +1,69 @@ +//package cn.wisenergy.shiro.config; +// +//import com.alibaba.fastjson.JSONObject; +//import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; +//import org.springframework.http.HttpStatus; +// +//import javax.servlet.ServletRequest; +//import javax.servlet.ServletResponse; +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +//import java.util.HashMap; +//import java.util.Map; +// +//public class AuthenticationFilter extends FormAuthenticationFilter { +// @Override +// protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { +// // 错误异常æç¤º +// HttpServletResponse httpResponse = (HttpServletResponse) response; +// HttpServletRequest httpRequest = (HttpServletRequest) request; +// String sessionId = ((HttpServletRequest) request).getHeader("sessionId"); +// if (sessionId == null) { +// setHeader(httpRequest, httpResponse); +// httpResponse.setCharacterEncoding("UTF-8"); +// httpResponse.setContentType("application/json"); +// Map<String, Object> map = new HashMap<>(); +// map.put("status", "1003"); +// map.put("message", "请先登录ï¼"); +// httpResponse.getWriter().write(JSONObject.toJSONString(map)); +// return false; +// } else { +// return true; +// } +// +// } +// +// /** +// * 为response设置header,实现跨域 +// */ +// private void setHeader(HttpServletRequest request, HttpServletResponse response) { +// //跨域的header设置 +// response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin")); +// response.setHeader("Access-Control-Allow-Methods", request.getMethod()); +// response.setHeader("Access-Control-Allow-Credentials", "true"); +// response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers")); +// //防æ¢ä¹±ç ï¼Œé€‚ç”¨äºŽä¼ è¾“JSONæ•°æ® +// //Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild +// response.setHeader("Content-Type", "application/json;charset=UTF-8"); +// response.setStatus(HttpStatus.OK.value()); +// } +// +// @Override +// protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { +// if (request instanceof HttpServletRequest) { +// if (((HttpServletRequest) request).getMethod().toUpperCase().equals("OPTIONS")) { +// return true; +// } +// } +// //å°ç¨‹åºæ”¾è¡Œ +// if(isFilter((HttpServletRequest) request)){ +// return true; +// } +// +// return super.isAccessAllowed(request, response, mappedValue); +// } +// //判æ–è¯·æ±‚å¤´ä¸æ˜¯å¦å¸¦æœ‰identityï¼ˆæ ‡è¯†æ˜¯å°ç¨‹åºï¼‰ +// public boolean isFilter(HttpServletRequest request) { +// return null != request.getHeader("identity") && request.getHeader("identity").equals("miniprogram"); +// } +//} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/filter/CustomerLogoutFilter.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/filter/CustomerLogoutFilter.java new file mode 100644 index 0000000..8478c11 --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/filter/CustomerLogoutFilter.java @@ -0,0 +1,66 @@ +package cn.wisenergy.shiro.filter; + +import cn.wisenergy.mapper.WorkUserMapper; +import cn.wisenergy.model.app.WorkUser; +import cn.wisenergy.shiro.util.CustomerRealm; +import org.apache.shiro.session.SessionException; +import org.apache.shiro.subject.SimplePrincipalCollection; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.authc.LogoutFilter; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +/** + * @description: 自定义退出 + * @author: nh + * @create: 2021-04-10 16:31 + **/ +public class CustomerLogoutFilter extends LogoutFilter { + @Autowired + private WorkUserMapper workUserMapper; + + @Autowired + private CustomerRealm realm; + + public CustomerLogoutFilter() { + } + + + // åˆ é™¤å˜å…¥redisä¸çš„认è¯ä¿¡æ¯ï¼Œå°ç¨‹åºè¯·æ±‚ä¸å¸¦session,用shiroçš„subject.logout()方法ä¸èƒ½å¤Ÿåˆ 除redisä¸çš„认è¯ä¿¡æ¯ + @Override + protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + // 请求的路径 + String requestURI = httpServletRequest.getRequestURI(); + // ä¸ä¸ºå¾®ä¿¡ç™»å‡ºåˆ™è¿›è¡Œä¸‹ä¸€è¿‡æ»¤å™¨ + if (!requestURI.equals("/wxLogout")) { + return true; + } + // shiro主体 + Subject subject = getSubject(request, response); + + // 获å–è¯·æ±‚çš„å‚æ•°ï¼šuserId + String userIdString = httpServletRequest.getParameter("userId"); + Integer userId = Integer.valueOf(userIdString); + // 获å–ç”¨æˆ·ä¿¡æ¯ + WorkUser user = workUserMapper.getUserById(userId); + // + SimplePrincipalCollection simplePrincipalCollection = new SimplePrincipalCollection(user,realm.getName()); + // åˆ é™¤ä¸»ä½“è®¤è¯ä¿¡æ¯ + realm.clearCachedAuthenticationInfo(simplePrincipalCollection); + try { + subject.logout(); + } catch (SessionException ise) { + ise.printStackTrace(); + } + // é‡å®šå‘åˆ°æŒ‡å®šåœ°å€ +// String redirectUrl = getRedirectUrl(request, response, subject); +// issueRedirect(request, response, redirectUrl); + // 为trueï¼Œè¿›å…¥å¾®ä¿¡é€€å‡ºæŽ¥å£ + return true; + } + +} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/filter/KickoutSessionControlFilter.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/filter/KickoutSessionControlFilter.java new file mode 100644 index 0000000..a7838b7 --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/filter/KickoutSessionControlFilter.java @@ -0,0 +1,171 @@ +package cn.wisenergy.shiro.filter; + +import cn.wisenergy.common.utils.exception.BASE_RESP_CODE_ENUM; +import cn.wisenergy.common.utils.exception.Result; +import cn.wisenergy.model.app.WorkUser; +import net.sf.json.JSONObject; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.exception.ExceptionUtils; +import org.apache.shiro.session.Session; +import org.apache.shiro.session.mgt.DefaultSessionKey; +import org.apache.shiro.session.mgt.SessionManager; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.AccessControlFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; +import java.io.Serializable; +import java.util.Deque; +import java.util.LinkedList; +import java.util.concurrent.TimeUnit; + +/** + * @description: + * @author: nh + * @create: 2021-04-06 17:41 + **/ +public class KickoutSessionControlFilter extends AccessControlFilter { + protected Logger log = LoggerFactory.getLogger(this.getClass()); + + private SessionManager sessionManager; + + // false为æå‡ºä¹‹å‰ç™»å½•的用户 + private boolean kickoutAfter = false; + + // ç”¨ä¸€ä¸ªè´¦å·æœ€å¤§çš„ä¼šè¯æ•°é‡ + private int maxSession = 1; + + private static final String DEFAULT_KICKOUT_CACHE_KEY_PREFIX = "shiro:cache:kickout:"; + + private String keyprefix = DEFAULT_KICKOUT_CACHE_KEY_PREFIX; + + private static final long EXPIRE_TIME = 30 * 60; + + @Autowired + private RedisTemplate redisTemplate; + + String getRedisKickoutKey(Integer userId) { + return keyprefix + userId; + } + + public void setSessionManager(SessionManager sessionManager) { + this.sessionManager = sessionManager; + } + + @Override + protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception { + //如果是å°ç¨‹åºè¯·æ±‚或请求登录接å£ï¼Œå°±æ”¾è¡Œ + return isMiniProgram((HttpServletRequest) request); + } + + @Override + protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { + Subject subject = getSubject(request, response); + + HttpServletResponse httpServletResponse = null; + // æ²¡æœ‰ç™»é™†æˆ–æ²¡æœ‰è®¾ç½®â€œè®°ä½æˆ‘†+ if (!subject.isAuthenticated() && !subject.isRemembered()) { + // 没有登陆,抛出异常 + httpServletResponse = (HttpServletResponse) response; + thrLogoutException(httpServletResponse, Result.RESULT_FLG.FAIL,BASE_RESP_CODE_ENUM.PLEASE_RE_LOGIN); + return false; + } + // 获å–当å‰ç”¨æˆ·è¯·æ±‚所æºå¸¦çš„session + Session session = subject.getSession(); + // 当å‰ç”¨æˆ· + WorkUser user = (WorkUser) subject.getPrincipal(); + Integer userId = user.getId(); + + // 获å–用户登录账户的session队列,å¹¶å°†è¶…è¿‡è§„å®šäººæ•°çš„ç”¨æˆ·è¿›é¡¹æ ‡è®° + this.getSessionQue(session, userId); + + // 如果当å‰ç”¨æˆ·è¢«æ ‡è®°ï¼Œåˆ™å°†ç”¨æˆ·ç™»å‡º + if (session.getAttribute("kickout") != null) { + try { + subject.logout(); + // 当剿‹¦æˆªå™¨ä¸ºå”¯ä¸€æ‹¦æˆªå™¨ï¼ŒæŠ›å‡ºæœªç™»å½•å¼‚å¸¸ï¼Œç»“æŸæœ¬æ¬¡è¯·æ±‚ + httpServletResponse = (HttpServletResponse) response; + thrLogoutException(httpServletResponse, Result.RESULT_FLG.FAIL,BASE_RESP_CODE_ENUM.PLEASE_RE_LOGIN); + return false; + } catch (Exception e) { + e.printStackTrace(); + } + } + + return true; + } + + // 获å–用户登录账户的sessioné˜Ÿåˆ—ï¼Œå¹¶å°†è¶…è¿‡è§„å®šäººæ•°çš„ç”¨æˆ·è¿›é¡¹æ ‡è®° + public void getSessionQue(Session session, Integer userId) { + Serializable sessionId = session.getId(); + + // åˆå§‹åŒ–用户的队列放在缓å˜ä¸ + Deque<Serializable> deque = (Deque<Serializable>) redisTemplate.opsForValue().get(getRedisKickoutKey(userId)); + if (deque == null || deque.size() == 0) { + deque = new LinkedList<>(); + } + // é˜Ÿåˆ—ä¸æ²¡æœ‰æ•°æ® + if (!deque.contains(sessionId) && session.getAttribute("kickout") == null) { + deque.push(sessionId); + } + // é˜Ÿåˆ—æ•°æ®æ•°é‡å¤§äºŽè®¾ç½®çš„ç”¨æˆ·ç™»å½•æ•°é‡ + while (deque.size() > maxSession) { + Serializable kickoutSessionId = null; + // 为true踢出åŽé¢çš„登录者 + if (kickoutAfter) { + kickoutSessionId = deque.removeFirst(); + } else { + kickoutSessionId = deque.removeLast(); + } + try { + Session kickoutSession = sessionManager.getSession(new DefaultSessionKey(kickoutSessionId)); + if (kickoutSession != null) { + // è®¾ç½®æ ‡è®°ä¸ºè¢«è¸¢å‡º + kickoutSession.setAttribute("kickout", true); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + // æ›´æ–°redisä¸çš„用户登录队列 + redisTemplate.opsForValue().set(getRedisKickoutKey(userId), deque, EXPIRE_TIME, TimeUnit.SECONDS); + } + + // 请求是为å°ç¨‹åºæˆ–请求接å£ä¸ºç™»å½•接å£ã€å°ç¨‹åºé€€å‡ºæŽ¥å£ + public boolean isMiniProgram(HttpServletRequest request) { + boolean isMini = null != request.getHeader("identity") && request.getHeader("identity").equals("miniprogram"); + return isMini || request.getRequestURI().equals("/login") || request.getRequestURI().equals("/wxLogout"); + } + + // 抛出未登录异常 + public void thrLogoutException(HttpServletResponse response, Result.RESULT_FLG resultFlg, BASE_RESP_CODE_ENUM respCodeEnum){ + PrintWriter writer = null; + try { + Result result = new Result(); + result.setResult(resultFlg.getValue()); + if (respCodeEnum != null) { + result.setErrorCode(respCodeEnum.getCode()); + result.setErrorMsg(respCodeEnum.getMsg()); + } + response.setContentType("application/json; charset=UTF-8"); + writer = response.getWriter(); + writer.write(JSONObject.fromObject(result).toString()); + writer.flush(); + } catch (Exception e) { + IOUtils.closeQuietly(writer); + log.error("接å£å¼‚常:{}", ExceptionUtils.getFullStackTrace(e)); + } finally { + if (writer != null) { + writer.close(); + } + } + } + +} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/ApplicationContextUtils.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/ApplicationContextUtils.java new file mode 100644 index 0000000..75c5d94 --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/ApplicationContextUtils.java @@ -0,0 +1,83 @@ +package cn.wisenergy.shiro.util; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * @description: + * @author: nh + * @create: 2021-04-06 11:31 + **/ +@Component +public class ApplicationContextUtils implements ApplicationContextAware { + + + private static ApplicationContext context; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + context = applicationContext; + } + + /** + * æ ¹æ®Beanå称获å–Bean对象 + * + * @param name Beanåç§° + * @return 对应åç§°çš„Bean对象 + */ + public static Object getBean(String name) { + return context.getBean(name); + } + + /** + * æ ¹æ®Bean的类型获å–对应的Bean + * + * @param requiredType Bean类型 + * @return 对应类型的Bean对象 + */ + public static <T> T getBean(Class<T> requiredType) { + return context.getBean(requiredType); + } + + /** + * æ ¹æ®Beanåç§°èŽ·å–æŒ‡å®šç±»åž‹çš„Bean对象 + * + * @param name Beanåç§° + * @param requiredType Bean类型(å¯ä¸ºç©ºï¼‰ + * @return 获å–对应Beanå称的指定类型Bean对象 + */ + public static <T> T getBean(String name, Class<T> requiredType) { + return context.getBean(name, requiredType); + } + + /** + * åˆ¤æ–æ˜¯å¦åŒ…å«å¯¹åº”åç§°çš„Bean对象 + * + * @param name Beanåç§° + * @return 包å«ï¼šè¿”回true,å¦åˆ™è¿”回false。 + */ + public static boolean containsBean(String name) { + return context.containsBean(name); + } + + /** + * 获å–对应Beanå称的类型 + * + * @param name Beanåç§° + * @return 返回对应的Bean类型 + */ + public static Class<?> getType(String name) { + return context.getType(name); + } + + /** + * 获å–上下文对象,å¯è¿›è¡Œå„ç§Spring的上下文æ“作 + * + * @return Spring上下文对象 + */ + public static ApplicationContext getContext() { + return context; + } +} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthenticationFilter.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthenticationFilter.java new file mode 100644 index 0000000..739f81b --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthenticationFilter.java @@ -0,0 +1,275 @@ +//package com.project.shiro.util; +// +//import com.alibaba.fastjson.JSONObject; +//import org.apache.shiro.authc.AuthenticationException; +//import org.apache.shiro.authc.AuthenticationToken; +//import org.apache.shiro.subject.Subject; +//import org.apache.shiro.util.StringUtils; +//import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; +//import org.apache.shiro.web.util.WebUtils; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +//import javax.servlet.ServletRequest; +//import javax.servlet.ServletResponse; +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +//import java.io.IOException; +//import java.io.PrintWriter; +// +///** +// * 自定义表å•认è¯è¿‡æ»¤å™¨ +// * +// * @author wyy +// * @date 2019/07/26 +// */ +//public class AuthenticationFilter extends FormAuthenticationFilter { +// private static final Logger log = LoggerFactory.getLogger(AuthenticationFilter.class); +// +// //åŠ å¯†å¯†ç 傿•° +// private static final String DEFAULT_EN_PASSWORD_PARAM = "enPassword"; +// +// //默认的登录åç§° +// private static final String DEFAULT_USERNAME_PARAM = "loginName"; +// +// //默认验è¯ç ID傿•° +// private static final String DEFAULT_CAPTCHA_ID_PARAM = "captchaId"; +// +// //默认验è¯ç 傿•° +// private static final String DEFAULT_CAPTCHA_PARAM = "captcha"; +// +// private String captchaIdParam = DEFAULT_CAPTCHA_ID_PARAM; +// +// private String captchaParam = DEFAULT_CAPTCHA_PARAM; +// +// private String usernameParam = DEFAULT_USERNAME_PARAM; +// +// private String enPasswordParam = DEFAULT_EN_PASSWORD_PARAM; +// +// /** +// * 创建token +// */ +// @Override +// protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) { +// String loginName = getUsername(request); +// String password = getPassword(request); +// boolean isRemeberMe = isRememberMe(request); +// String ip = getHost(request); +// return new com.project.shiro.util.AuthenticationToken(loginName, password, isRemeberMe, ip, "", ""); +// } +// +// /** +// * 登录拒ç»ï¼›å¢žåŠ Ajax异æ¥å¤„ç† +// * +// * @param servletRequest 请求对象 +// * @param servletResponse å“应对象 +// * @return +// * @throws Exception +// */ +// @Override +// protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { +// // åˆ¤æ–æ˜¯å¦ä¸ºajax异æ¥è¯·æ±‚ +// HttpServletRequest request = (HttpServletRequest) servletRequest; +// HttpServletResponse response = (HttpServletResponse) servletResponse; +// +// // åˆ¤æ–æ˜¯å¦ä¸ºç™»å½•请求 +// if (this.isLoginRequest(servletRequest, response)) { +// if (this.isLoginSubmission(servletRequest, response)) { +// +// if (log.isTraceEnabled()) { +// log.trace("Login submission detected. Attempting to execute login."); +// } +// boolean b = executeLogin(servletRequest, response); +// return b; +// } else { +// if (log.isTraceEnabled()) { +// log.trace("Login page view."); +// } +// return true; +// } +// } else { +// if (log.isTraceEnabled()) { +// log.trace("Attempting to access a path which requires authentication. Forwarding to the Authentication url [" + this.getLoginUrl() + "]"); +// } +// +// // 异æ¥è¯·æ±‚报错 +// if (isAjaxReq(request, response)) { +// response.setContentType("application/json"); +// response.setCharacterEncoding("UTF-8"); +// PrintWriter out = response.getWriter(); +// JSONObject json = new JSONObject(); +// json.put("result", "fail"); +// json.put("msg", "未登录"); +// out.println(json); +// out.flush(); +// out.close(); +// return false; +// } +// +//// å¦‚æžœåŒæ¥è¯·æ±‚ç»§ç»æ‰§è¡ŒåŸºç±»æ–¹æ³•ï¼ˆå½“ä¸ºåŒæ¥æ–¹æ³•的时候,基类会直接跳转登录页é¢ï¼‰ +// return super.onAccessDenied(request, response); +// } +// +// } +// +// /** +// * é‡å†™ç™»å½•æˆåŠŸçš„æ–¹æ³•ï¼›å¦‚æžœä¸ºå¼‚æ¥è¯·æ±‚,直接返回æˆåŠŸå“应 +// * +// * @param token +// * @param subject +// * @param servletRequest +// * @param servletResponse +// * @return +// * @throws Exception +// */ +// @Override +// protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { +// // 如果为异æ¥è¯·æ±‚,登录æˆåŠŸåŽï¼Œç›´æŽ¥è¿”回数æ®ï¼Œå‰å°è·³è½¬ç™»å½•åŽçš„页é¢å¤„ç† +// if (isAjaxReq(servletRequest, servletResponse)) { +// HttpServletResponse response = (HttpServletResponse) servletResponse; +// response.setContentType("application/json"); +// response.setCharacterEncoding("UTF-8"); +// PrintWriter out = response.getWriter(); +// JSONObject json = new JSONObject(); +// json.put("result", "success"); +// json.put("msg", "登录æˆåŠŸ"); +// out.write(json.toJSONString()); +// out.flush(); +// out.close(); +// return true; +// } +// return super.onLoginSuccess(token, subject, servletRequest, servletResponse); +// } +// +// @Override +// public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { +// //Always return true if the request's method is OPTIONSif (request instanceof HttpServletRequest) { +// if (((HttpServletRequest) request).getMethod().toUpperCase().equals("OPTIONS")) { +// return true; +// } +// return super.isAccessAllowed(request, response, mappedValue); +// } +// +// /** +// * é‡å†™ç™»å½•失败的方法;如果为异æ¥è¯·æ±‚,直接返回失败å“应 +// * +// * @param token +// * @param e +// * @param request +// * @param response +// * @return +// */ +// @Override +// protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) { +// // 如果为异æ¥ç™»å½•,直接返回错误结果 +// if (isAjaxReq(request, response)) { +// PrintWriter out = null; +// try { +// response = (HttpServletResponse) response; +// response.setContentType("application/json"); +// response.setCharacterEncoding("UTF-8"); +// out = response.getWriter(); +// JSONObject json = new JSONObject(); +// if (e.equals("org.apache.shiro.authc.pam.UnsupportedTokenException")) { +// String message = "验è¯ç 错误!"; +// json.put("result", "fail"); +// json.put("msg", message); +// } else if (e.equals("org.apache.shiro.authc.UnknownAccountException")) { +// String message = "æ¤è´¦å·ä¸å˜åœ¨!"; +// json.put("result", "fail"); +// json.put("msg", message); +// } else if (e.equals("org.apache.shiro.authc.DisabledAccountException")) { +// String message = "æ¤è´¦å·å·²è¢«ç¦ç”¨!"; +// json.put("result", "fail"); +// json.put("msg", message); +// } else if (e.equals("org.apache.shiro.authc.LockedAccountException")) { +// String message = "æ¤è´¦å·å·²è¢«é”定"; +// json.put("result", "fail"); +// json.put("msg", message); +// } else if (e.equals("org.apache.shiro.authc.IncorrectCredentialsException")) { +// String message = "密ç 错误"; +// json.put("result", "fail"); +// json.put("msg", message); +// } else if (e.equals("org.apache.shiro.authc.AuthenticationException")) { +// String message = "è´¦å·è®¤è¯å¤±è´¥!"; +// json.put("result", "fail"); +// json.put("msg", message); +// } +// out.write(json.toJSONString()); +// out.flush(); +// out.close(); +// return false; +// } catch (IOException ex) { +// ex.printStackTrace(); +// log.error("shiro认è¯å¤±è´¥"); +// } +// +// } +// +// // åŒæ¥è¯·æ±‚走基类 +// return super.onLoginFailure(token, e, request, response); +// } +// +// +// /** +// * 获å–密ç +// * +// * @param servletRequest +// * @return +// */ +// @Override +// protected String getPassword(ServletRequest servletRequest) { +// String parameter = servletRequest.getParameter(enPasswordParam); +// HttpServletRequest request = (HttpServletRequest) servletRequest; +// String enPasswor = request.getParameter(enPasswordParam); +// String password = enPasswor; +// return password; +// } +// +// /** +// * åˆ¤æ–æ˜¯å¦ä¸ºAjax请求 +// * +// * @param servletRequest +// * @param servletResponse +// * @return +// */ +// public boolean isAjaxReq(ServletRequest servletRequest, ServletResponse servletResponse) { +// boolean isAjaxReq = false; +// HttpServletRequest request = (HttpServletRequest) servletRequest; +// HttpServletResponse response = (HttpServletResponse) servletResponse; +// String requestType = request.getHeader("X-Requested-With"); +// if (requestType != null && requestType.equalsIgnoreCase("XMLHttpRequest")) { +// isAjaxReq = true; +// } +// return isAjaxReq; +// } +// +// public String getEnPasswordParam() { +// return enPasswordParam; +// } +// +// public void setEnPasswordParam(String enPasswordParam) { +// this.enPasswordParam = enPasswordParam; +// } +// +// public String getUsernameParam() { +// return usernameParam; +// } +// +// public String getCaptchaIdParam() { +// return captchaIdParam; +// } +// +// public void setCaptchaIdParam(String captchaIdParam) { +// this.captchaIdParam = captchaIdParam; +// } +// +// public String getCaptchaParam() { +// return captchaParam; +// } +// +// public void setCaptchaParam(String captchaParam) { +// this.captchaParam = captchaParam; +// } +// +//} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthenticationRealm.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthenticationRealm.java new file mode 100644 index 0000000..9672e4e --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthenticationRealm.java @@ -0,0 +1,184 @@ +//package com.project.shiro.util; +// +//import cn.wisenergy.common.utils.Md5Util; +//import cn.wisenergy.mapper.WorkUserMapper; +//import cn.wisenergy.model.app.WorkRole; +//import cn.wisenergy.model.app.WorkUser; +//import cn.wisenergy.service.WorkUserService; +//import org.apache.commons.collections.CollectionUtils; +//import org.apache.commons.lang3.StringUtils; +//import org.apache.shiro.authc.*; +//import org.apache.shiro.authz.AuthorizationInfo; +//import org.apache.shiro.authz.Permission; +//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 java.util.Collection; +//import java.util.HashSet; +//import java.util.List; +//import java.util.Set; +// +///** +// * è®¤è¯ +// */ +//public class AuthenticationRealm extends AuthorizingRealm { +// // 用户离èŒçŠ¶æ€ +// private final static int USER_STATUS = 0; +// +// @Autowired +// private WorkUserMapper workUserMapper; +// +// +// @Autowired +// private WorkUserService workUserService; +// +// /** +// * 获å–认è¯ä¿¡æ¯ +// */ +// @Override +// protected AuthenticationInfo doGetAuthenticationInfo(org.apache.shiro.authc.AuthenticationToken token) { +// UsernamePasswordToken authToken = (UsernamePasswordToken) token; +// // 获å–登录åã€å¯†ç +// String username = authToken.getUsername(); +// String password = new String(authToken.getPassword()); +// +// if (StringUtils.isNotEmpty(username) && StringUtils.isNotEmpty(password)) { +// WorkUser userInfo = workUserMapper.getUserByLoginName(username); +// +// if (userInfo == null) { +// throw new UnknownAccountException(); +// } +// +// if (!userInfo.getStatus().equals(USER_STATUS)) { +// throw new DisabledAccountException(); +// } +// +//// //用户é”定 +//// if (admin.getIsLocked()) { +//// +//// //è´¦å·é”定分钟数 +//// Date lockedDate = admin.getLockedDate(); +//// Date unlockedDate = DateUtils.addMinutes(lockedDate, 10); +//// +//// //判æ–é”定时间是å¦å·²è¿‡ +//// if (new Date().after(unlockedDate)) { +//// admin.setLoginFailCnt(0); +//// admin.setIsLocked(false); +//// admin.setLockedDate(null); +//// adminService.update(admin); +//// } else { +//// throw new LockedAccountException(); +//// } +//// } +// +// //密ç 䏿£ç¡® +// if (!Md5Util.digestMD5(password).equals(userInfo.getPassword())) { +// throw new IncorrectCredentialsException(); +// } +// return new SimpleAuthenticationInfo(userInfo, password, getName()); +// } +// throw new UnknownAccountException(); +// } +// +// /** +// * èŽ·å–æŽˆæƒä¿¡æ¯ +// */ +// @Override +// protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { +// WorkUser user = (WorkUser) principals.getPrimaryPrincipal(); +// +// if (user != null) { +// SimpleAuthorizationInfo authInfo = new SimpleAuthorizationInfo(); +// +//// //获å–admin对象 +//// List<Admin> admins = adminService.getAdminCascadeRole(adminTemp); +//// Admin admin = admins.get(0); +// List<WorkRole> userRole = workUserMapper.getUserRole(user.getId()); +// +// //获å–ç”¨æˆ·çš„è§’è‰²ä¿¡æ¯ +// Set<String> roleSet = new HashSet<>(); +// for (WorkRole role : userRole) { +// roleSet.add(role.getName()); +// } +// +// //æ ¹æ®è§’色idsèŽ·å–æƒé™ä¿¡æ¯ +//// List<Menu> menuList = menuService.findOrdinaryMenu(principal.getId()); +//// Set<String> menuSet = new HashSet<String>(); +//// for (Menu menu : menuList) { +//// if (StringUtils.isNotBlank(menu.getCode())) { +//// menuSet.add(menu.getCode()); +//// } +//// } +// +// //å°†è§’è‰²å’Œèµ„æºæ”¾å…¥æŽˆæƒå¯¹è±¡ä¸ +// authInfo.addRoles(roleSet); +//// authInfo.addStringPermissions(menuSet); +// return authInfo; +// } +// +// return null; +// } +// +// /** +// * 超级管ç†å‘˜è‡ªåŠ¨èŽ·å–æ‰€æœ‰æƒé™ +// */ +//// @Override +//// public boolean isPermitted(PrincipalCollection principals, String permission) { +////// User user = ((User) principals.getPrimaryPrincipal()); +////// if (Role.ADMIN_FLAG_SUPER_ADMIN == user.getRole().getAdminFlag()) { +////// return true; +////// } +//// +//// return isPermitted(principals, getPermissionResolver().resolvePermission(permission)); +//// } +// +// @Override +// public boolean isPermitted(PrincipalCollection principals, Permission permission) { +// AuthorizationInfo info = getAuthorizationInfo(principals); +// Collection<Permission> perms = getPermissions(info); +// if (CollectionUtils.isEmpty(perms)) { +// return false; +// } +// +// for (Permission perm : perms) { +// if (perm.implies(permission)) { +// return true; +// } +// } +// +// return false; +// } +// +// /** +// * 踢掉上一个登录的åŒå用户 +// * +// * @param id 主键 +// */ +// +//// private void stopPreviousSession(Integer id) { +//// Collection<Session> sessions = sessionDAO.getActiveSessions(); +//// Session currSession = SecurityUtils.getSubject().getSession(); +//// Serializable sId = currSession.getId(); +//// for (Session session : sessions) { +//// SimplePrincipalCollection collection = (SimplePrincipalCollection) session +//// .getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); +//// if (collection == null) { +//// continue; +//// } +//// +//// User u = (User) collection.getPrimaryPrincipal(); +//// if (id.equals(u.getId())) { +//// if (sId.equals(session.getId())) { +//// continue; +//// } +//// +//// session.stop(); +//// break; +//// } +//// } +//// } +// +// +//} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthenticationToken.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthenticationToken.java new file mode 100644 index 0000000..b63138e --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthenticationToken.java @@ -0,0 +1,41 @@ +//package com.project.shiro.util; +// +//import org.apache.shiro.authc.UsernamePasswordToken; +// +///** +// * 登录令牌 +// */ +//public class AuthenticationToken extends UsernamePasswordToken { +// +// private static final long serialVersionUID = 4628652632307774263L; +// +// //验è¯ç ID +// private String captchaId; +// +// //验è¯ç +// private String captcha; +// +// //ipä¿ç•™ +// public AuthenticationToken(String loginName, String password, boolean remeberMe, String ip, String captchaId, String caprcha) { +// super(loginName, password, remeberMe); +// this.captchaId = captchaId; +// this.captcha = caprcha; +// } +// +// public String getCaptchaId() { +// return captchaId; +// } +// +// public void setCaptchaId(String captchaId) { +// this.captchaId = captchaId; +// } +// +// public String getCaptcha() { +// return captcha; +// } +// +// public void setCaptcha(String captcha) { +// this.captcha = captcha; +// } +// +//} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthorizationFilter.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthorizationFilter.java new file mode 100644 index 0000000..fc3a485 --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/AuthorizationFilter.java @@ -0,0 +1,47 @@ +//package com.project.shiro.util; +// +//import com.alibaba.fastjson.JSONObject; +//import io.swagger.annotations.ResponseHeader; +//import org.apache.commons.lang3.StringUtils; +//import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter; +// +//import javax.servlet.ServletRequest; +//import javax.servlet.ServletResponse; +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +//import java.io.IOException; +//import java.io.PrintWriter; +// +///** +// * @author wyy +// * @date 2019-09-14 17:57 +// */ +//public class AuthorizationFilter extends PermissionsAuthorizationFilter { +// /** +// * shiro认è¯perms资æºå¤±è´¥åŽå›žè°ƒæ–¹æ³• +// * @param servletRequest +// * @param servletResponse +// * @return +// * @throws IOException +// */ +// @Override +// protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException { +// HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; +// HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; +// String requestedWith = httpServletRequest.getHeader("X-Requested-With"); +// if (StringUtils.isNotEmpty(requestedWith) && StringUtils.equals(requestedWith, "XMLHttpRequest")) {//如果是ajaxè¿”å›žæŒ‡å®šæ ¼å¼æ•°æ® +// httpServletResponse.setContentType("application/json"); +// httpServletResponse.setCharacterEncoding("UTF-8"); +// PrintWriter out = httpServletResponse.getWriter(); +// JSONObject json = new JSONObject(); +// json.put("result", "success"); +// json.put("msg", "登录æˆåŠŸ"); +// out.write(json.toJSONString()); +// out.flush(); +// out.close(); +// } else {//如果是普通请求进行é‡å®šå‘ +// httpServletResponse.sendRedirect("/403"); +// } +// return false; +// } +//} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/CustomerRealm.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/CustomerRealm.java new file mode 100644 index 0000000..4729737 --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/CustomerRealm.java @@ -0,0 +1,48 @@ +package cn.wisenergy.shiro.util; + +import cn.wisenergy.mapper.WorkUserMapper; +import cn.wisenergy.model.app.WorkUser; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.apache.shiro.subject.SimplePrincipalCollection; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @description: + * @author: nh + * @create: 2021-04-05 18:04 + **/ +public class CustomerRealm extends AuthorizingRealm { + + @Autowired + private WorkUserMapper workUserMapper; + + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { + return null; + } + + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { + String principal = (String) token.getPrincipal(); + WorkUser user = workUserMapper.getUserByLoginName(principal); + if (user != null) { + return new SimpleAuthenticationInfo(user, user.getPassword(), this.getName()); + } + return null; + } + + @Override + public void clearCachedAuthenticationInfo(PrincipalCollection principals) { + // å˜å…¥redisä¸çš„认è¯ä¿¡æ¯æ˜¯ä»¥"Authentication"+loginName为key + // 在认è¯ä¿¡æ¯ä¸ä¸å˜å…¥çš„主体信æ¯ä¸ºWorkUser对象,需è¦å°†loginNameå–å‡ºä¸ºåˆ é™¤è®¤è¯ä¿¡æ¯ä½¿ç”¨ + WorkUser user = (WorkUser)principals.getPrimaryPrincipal(); + SimplePrincipalCollection newPrincipals = new SimplePrincipalCollection(user.getLoginName(), this.getName()); + super.clearCachedAuthenticationInfo(newPrincipals); + } +} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/ExceptionUtil.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/ExceptionUtil.java new file mode 100644 index 0000000..36e9ca4 --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/ExceptionUtil.java @@ -0,0 +1,9 @@ +package cn.wisenergy.shiro.util; + +/** + * @description: + * @author: nh + * @create: 2021-04-11 23:45 + **/ +public class ExceptionUtil { +} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/Principal.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/Principal.java new file mode 100644 index 0000000..6664b34 --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/Principal.java @@ -0,0 +1,38 @@ +//package com.project.shiro.util; +// +//import java.io.Serializable; +// +//public class Principal implements Serializable { +// +// private static final long serialVersionUID = 598764316789461315L; +// +// public Long id; +// +// public String loginName; +// +// public Principal(Long id, String loginName) { +// this.id = id; +// this.loginName = loginName; +// } +// +// public Principal() { +// +// } +// +// public Long getId() { +// return id; +// } +// +// public void setId(Long id) { +// this.id = id; +// } +// +// public String getLoginName() { +// return loginName; +// } +// +// public void setLoginName(String loginName) { +// this.loginName = loginName; +// } +// +//} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/ShiroSessionManager.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/ShiroSessionManager.java new file mode 100644 index 0000000..76ff54a --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/ShiroSessionManager.java @@ -0,0 +1,47 @@ +package cn.wisenergy.shiro.util; + +import org.apache.commons.lang.StringUtils; +import org.apache.shiro.session.Session; +import org.apache.shiro.session.SessionException; +import org.apache.shiro.session.mgt.SessionKey; +import org.apache.shiro.web.servlet.ShiroHttpServletRequest; +import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; +import org.apache.shiro.web.util.WebUtils; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.Serializable; + +/** + * @description: 自定义sessionManager + * @author: nh + * @create: 2021-04-09 14:25 + **/ +public class ShiroSessionManager extends DefaultWebSessionManager { + + private static final String AUTHORIZATION = "Authorization"; + + private static final String REFERENCED_SESSION_ID_SOURCE = "Stateless request"; + + @Override + protected Serializable getSessionId(ServletRequest request, ServletResponse response){ + String id = WebUtils.toHttp(request).getHeader(AUTHORIZATION); + if(StringUtils.isEmpty(id)){ + //如果没有æºå¸¦id傿•°åˆ™æŒ‰ç…§çˆ¶ç±»çš„æ–¹å¼åœ¨cookieè¿›è¡ŒèŽ·å– + return super.getSessionId(request, response); + }else{ + //å¦‚æžœè¯·æ±‚å¤´ä¸æœ‰ authToken 则其值为sessionId + request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,REFERENCED_SESSION_ID_SOURCE); + request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID,id); + request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID,Boolean.TRUE); + return id; + } + } + + + @Override + public Session getSession(SessionKey key) throws SessionException { + + return super.getSession(key); + } +} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/RedisCache.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/RedisCache.java new file mode 100644 index 0000000..99e6e1d --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/RedisCache.java @@ -0,0 +1,85 @@ +package cn.wisenergy.shiro.util.redis; + +import cn.wisenergy.common.utils.exception.BASE_RESP_CODE_ENUM; +import cn.wisenergy.common.utils.exception.BaseCustomException; +import cn.wisenergy.shiro.util.ApplicationContextUtils; +import org.apache.shiro.cache.Cache; +import org.apache.shiro.cache.CacheException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.Collection; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * @description: + * @author: nh + * @create: 2021-04-05 18:16 + **/ +public class RedisCache<K,V> implements Cache<K,V> { + + //åˆå§‹åŒ–Log日志 + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + private String cacheName; + + private static final long EXPIRE_TIME = 30 * 60; + + public RedisCache() { + } + + public RedisCache(String cacheName) { + this.cacheName = cacheName; + } + + @Override + public V get(K k) throws CacheException { + Object o = getRedisUtil().opsForValue().get(this.cacheName + k.toString()); + return (V) o; + } + + @Override + public V put(K k, V v) throws CacheException { + getRedisUtil().opsForValue().set(this.cacheName + k.toString(),v,EXPIRE_TIME, TimeUnit.SECONDS); + return null; + } + + @Override + public V remove(K k) throws CacheException { + logger.debug("从redisä¸åˆ 除 key [" + k + "]"); + try { + V previous = get(k); + getRedisUtil().delete(this.cacheName + k.toString()); + return previous; + } catch (Exception e) { + e.printStackTrace(); + throw new BaseCustomException(BASE_RESP_CODE_ENUM.RESOURCE_NOT_FOUND); + } + } + + @Override + public void clear() throws CacheException { + } + + @Override + public int size() { + return 0; + } + + @Override + public Set<K> keys() { + return null; + } + + @Override + public Collection<V> values() { + return null; + } + + RedisTemplate getRedisUtil(){ + return (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate"); + } + +} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/RedisCacheManager.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/RedisCacheManager.java new file mode 100644 index 0000000..8a8f24d --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/RedisCacheManager.java @@ -0,0 +1,17 @@ +package cn.wisenergy.shiro.util.redis; + +import org.apache.shiro.cache.Cache; +import org.apache.shiro.cache.CacheException; +import org.apache.shiro.cache.CacheManager; + +/** + * @description: + * @author: nh + * @create: 2021-04-05 18:17 + **/ +public class RedisCacheManager implements CacheManager { + @Override + public <K, V> Cache<K, V> getCache(String cacheName) throws CacheException { + return new RedisCache<K,V>(cacheName); + } +} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/RedisSessionDao.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/RedisSessionDao.java new file mode 100644 index 0000000..56544c0 --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/RedisSessionDao.java @@ -0,0 +1,94 @@ +package cn.wisenergy.shiro.util.redis; + +import cn.wisenergy.common.utils.ByteUtil; +import org.apache.shiro.session.Session; +import org.apache.shiro.session.UnknownSessionException; +import org.apache.shiro.session.mgt.eis.AbstractSessionDAO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; + +import java.io.IOException; +import java.io.Serializable; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * @description: + * @author: nh + * @create: 2021-04-07 11:07 + **/ +public class RedisSessionDao extends AbstractSessionDAO { + + @Autowired + private RedisTemplate redisTemplate; + + private static final String REDIS_SESSION_PREFIX = "SHIRO_SESSION"; + + private static final long EXPIRE_TIME = 30 * 60; + + @Override + protected Serializable doCreate(Session session) { + Serializable sessionId = this.generateSessionId(session); + this.assignSessionId(session, sessionId); + this.saveSession(session); + return sessionId; + } + + private void saveSession(Session session) { + if (session == null || session.getId() == null) { + return; + } + redisTemplate.opsForValue().set(getRedisSessionPrefix(session.getId()), session, EXPIRE_TIME, TimeUnit.SECONDS); + } + + String getRedisSessionPrefix(Serializable sessionId) { + return REDIS_SESSION_PREFIX + sessionId; + } + + + @Override + protected Session doReadSession(Serializable sessionId) { + Object o = redisTemplate.opsForValue().get(getRedisSessionPrefix(sessionId)); + return (Session) o; + } + + @Override + public void update(Session session) throws UnknownSessionException { + this.saveSession(session); + } + + @Override + public void delete(Session session) { + redisTemplate.delete(getRedisSessionPrefix(session.getId())); + } + + @Override + public Collection<Session> getActiveSessions() { + Set<Session> sessions = new HashSet<>(); + + Set<byte[]> keys = null; + try { + redisTemplate.keys(ByteUtil.objectToBytes(REDIS_SESSION_PREFIX + "*")); + + } catch (IOException e) { + e.printStackTrace(); + } + if (keys != null && keys.size() > 0) { + for (byte[] key : keys) { + Session s = null; + try { + s = (Session) ByteUtil.bytesToObject((byte[]) redisTemplate.opsForValue().get(key)); + } catch (IOException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + sessions.add(s); + } + } + + return sessions; + } +} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/ShiroRedisCache.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/ShiroRedisCache.java new file mode 100644 index 0000000..0529847 --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/ShiroRedisCache.java @@ -0,0 +1,178 @@ +//package com.project.shiro.util.redis; +// +//import cn.wisenergy.service.common.utils.ByteUtil; +//import cn.wisenergy.service.common.utils.redis.RedisClient; +//import cn.wisenergy.service.common.utils.redis.RedisConsts; +//import org.apache.shiro.cache.Cache; +//import org.apache.shiro.cache.CacheException; +//import org.apache.shiro.util.CollectionUtils; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +//import javax.annotation.Resource; +//import java.io.IOException; +//import java.util.*; +// +//public class ShiroRedisCache<K, V> implements Cache<K, V> { +// +// //åˆå§‹åŒ–Log日志 +// private Logger logger = LoggerFactory.getLogger(this.getClass()); +// +// //注入redisClient实例 +// @Resource(name = "redisClient") +// private RedisClient redisClient; +// +// //shiroSessionçš„key值å‰ç¼€ +// private String keyPrefix; +// +// //通过redisClient实例和prefix傿•°æž„é€ redisCache +// public ShiroRedisCache(RedisClient redisClient, String prefix) { +// if (redisClient == null) { +// throw new IllegalArgumentException("shiroRedisCaheåˆå§‹åŒ–时,redisClient傿•°ä¸èƒ½ä¸ºç©º"); +// } +// this.redisClient = redisClient; +// this.keyPrefix = prefix; +// } +// +// /** +// * 获得String类型的KEY +// * +// * @param key +// * @return +// */ +// private String getPreStringKey(K key) { +// String preKey = null; +// if (key instanceof String) { +// preKey = this.keyPrefix + key; +// return preKey; +// } else { +// try { +// preKey = keyPrefix + ByteUtil.bytesToHexString(ByteUtil.objectToBytes(key)); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// return preKey; +// } +// } +// +// @Override +// public V get(K key) throws CacheException { +// logger.debug("æ ¹æ®key从Redisä¸èŽ·å–对象 key [" + key + "]"); +// try { +// if (key == null) { +// return null; +// } else { +// V Vvalue = (V) redisClient.get(getPreStringKey(key)); +// if (Vvalue == null) { +// return null; +// } +// return Vvalue; +// } +// } catch (Throwable t) { +// throw new CacheException(t); +// } +// +// } +// +// @Override +// public V put(K key, V value) throws CacheException { +// logger.debug("æ ¹æ®key从å˜å‚¨ key [" + key + "]"); +// try { +// redisClient.set(getPreStringKey(key), value); +// redisClient.setAndExpire(getPreStringKey(key), value, RedisConsts.ADMIN_SHIRO_REALM_EXPIRE); +// return value; +// } catch (Throwable t) { +// throw new CacheException(t); +// } +// } +// +// @Override +// public V remove(K key) throws CacheException { +// logger.debug("从redisä¸åˆ 除 key [" + key + "]"); +// try { +// V previous = get(key); +// redisClient.del(getPreStringKey(key)); +// return previous; +// } catch (Throwable t) { +// throw new CacheException(t); +// } +// } +// +// @Override +// public void clear() throws CacheException { +// logger.debug("从redisä¸åˆ é™¤æ‰€æœ‰å…ƒç´ "); +// try { +//// redisClient.flushDB(); +// } catch (Throwable t) { +// throw new CacheException(t); +// } +// } +// +// @Override +// public int size() { +//// try { +//// Long longSize = new Long(redisClient.dbSize()); +//// return longSize.intValue(); +//// } catch (Throwable t) { +//// throw new CacheException(t); +//// } +// return 0; +// } +// +// @SuppressWarnings("unchecked") +// @Override +// public Set<K> keys() { +// try { +// Set<byte[]> keys = redisClient.keys(ByteUtil.objectToBytes(this.keyPrefix + "*")); +// if (CollectionUtils.isEmpty(keys)) { +// return Collections.emptySet(); +// } else { +// Set<K> newKeys = new HashSet<K>(); +// for (byte[] key : keys) { +// newKeys.add((K) key); +// } +// return newKeys; +// } +// } catch (Throwable t) { +// throw new CacheException(t); +// } +// } +// +// @Override +// public Collection<V> values() { +// try { +// Set<byte[]> keys = redisClient.keys(ByteUtil.objectToBytes(this.keyPrefix + "*")); +// if (!CollectionUtils.isEmpty(keys)) { +// List<V> values = new ArrayList<V>(keys.size()); +// for (byte[] key : keys) { +// @SuppressWarnings("unchecked") +// V value = get((K) key); +// if (value != null) { +// values.add(value); +// } +// } +// return Collections.unmodifiableList(values); +// } else { +// return Collections.emptyList(); +// } +// } catch (Throwable t) { +// throw new CacheException(t); +// } +// } +// +// public String getKeyPrefix() { +// return keyPrefix; +// } +// +// public void setKeyPrefix(String keyPrefix) { +// this.keyPrefix = keyPrefix; +// } +// +// public RedisClient getRedisClient() { +// return redisClient; +// } +// +// public void setRedisClient(RedisClient redisClient) { +// this.redisClient = redisClient; +// } +//} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/ShiroRedisCacheManager.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/ShiroRedisCacheManager.java new file mode 100644 index 0000000..fe9bb36 --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/ShiroRedisCacheManager.java @@ -0,0 +1,59 @@ +//package com.project.shiro.util.redis; +// +// +//import cn.wisenergy.service.common.utils.redis.RedisClient; +//import cn.wisenergy.service.common.utils.redis.RedisConsts; +//import org.apache.shiro.cache.Cache; +//import org.apache.shiro.cache.CacheException; +//import org.apache.shiro.cache.CacheManager; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +//import javax.annotation.Resource; +//import java.util.concurrent.ConcurrentHashMap; +//import java.util.concurrent.ConcurrentMap; +// +//public class ShiroRedisCacheManager implements CacheManager { +// +// private static final Logger logger = LoggerFactory.getLogger(ShiroRedisCacheManager.class); +// +// private final ConcurrentMap<String, Cache> caches = new ConcurrentHashMap<String, Cache>(); +// +// //注入redisClient实例 +// @Resource(name = "redisClient") +// private RedisClient redisClient; +// +// /** +// * shiroæƒé™ç¼“å˜å‰ç¼€ +// */ +// private String keyPrefix = RedisConsts.ADMIN_SHIRO_REALM_KEY; +// +// +// @Override +// public <K, V> Cache<K, V> getCache(String name) throws CacheException { +// +// logger.debug("获å–å称为: " + name + " çš„RedisCache实例"); +// Cache c = caches.get(keyPrefix + name); +// if (c == null) { +// c = new ShiroRedisCache<K, V>(redisClient, keyPrefix); +// caches.put(keyPrefix + name, c); +// } +// return c; +// } +// +// public RedisClient getRedisClient() { +// return redisClient; +// } +// +// public void setRedisClient(RedisClient redisClient) { +// this.redisClient = redisClient; +// } +// +// public String getKeyPrefix() { +// return keyPrefix; +// } +// +// public void setKeyPrefix(String keyPrefix) { +// this.keyPrefix = keyPrefix; +// } +//} diff --git a/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/ShiroRedisSessionDAO.java b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/ShiroRedisSessionDAO.java new file mode 100644 index 0000000..6fa4f6c --- /dev/null +++ b/wisenergy-shiro/src/main/java/cn/wisenergy/shiro/util/redis/ShiroRedisSessionDAO.java @@ -0,0 +1,129 @@ +//package com.project.shiro.util.redis; +// +//import cn.wisenergy.service.common.utils.ByteUtil; +//import cn.wisenergy.service.common.utils.redis.RedisClient; +//import cn.wisenergy.service.common.utils.redis.RedisConsts; +//import org.apache.shiro.session.Session; +//import org.apache.shiro.session.UnknownSessionException; +//import org.apache.shiro.session.mgt.eis.AbstractSessionDAO; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +//import javax.annotation.Resource; +//import java.io.IOException; +//import java.io.Serializable; +//import java.util.Collection; +//import java.util.HashSet; +//import java.util.Set; +// +//public class ShiroRedisSessionDAO extends AbstractSessionDAO { +// +// private static Logger logger = LoggerFactory.getLogger(ShiroRedisSessionDAO.class); +// +// //注入redisClient实例 +// @Resource(name = "redisClient") +// private RedisClient redisClient; +// +// /** +// * shiro-redisçš„session对象å‰ç¼€ +// */ +// +// private String keyPrefix = RedisConsts.ADMIN_SHIRO_SESSION_KEY; +// +// @Override +// public void update(Session session) throws UnknownSessionException { +// this.saveSession(session); +// } +// +// private void saveSession(Session session) throws UnknownSessionException { +// if (session == null || session.getId() == null) { +// logger.error("session or session id is null"); +// return; +// } +// this.redisClient.setAndExpire(this.getPreStringKey(session.getId()), session, RedisConsts.ADMIN_SHIRO_SESSION_EXPIRE); +// } +// +// @Override +// public void delete(Session session) { +// if (session == null || session.getId() == null) { +// logger.error("session or session id is null"); +// return; +// } +// redisClient.del(getPreStringKey(session.getId())); +// +// } +// +// @Override +// public Collection<Session> getActiveSessions() { +// Set<Session> sessions = new HashSet<Session>(); +// +// Set<byte[]> keys = null; +// try { +// keys = redisClient.keys(ByteUtil.objectToBytes(this.keyPrefix + "*")); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// if (keys != null && keys.size() > 0) { +// for (byte[] key : keys) { +// Session s = null; +// try { +// s = (Session) ByteUtil.bytesToObject(redisClient.get(key)); +// } catch (IOException e) { +// e.printStackTrace(); +// } catch (ClassNotFoundException e) { +// e.printStackTrace(); +// } +// sessions.add(s); +// } +// } +// +// return sessions; +// } +// +// @Override +// protected Serializable doCreate(Session session) { +// Serializable sessionId = this.generateSessionId(session); +// this.assignSessionId(session, sessionId); +// this.saveSession(session); +// return sessionId; +// } +// +// @Override +// protected Session doReadSession(Serializable sessionId) { +// if (sessionId == null) { +// logger.error("session id is null"); +// return null; +// } +// +// Session s = (Session) redisClient.get(this.getPreStringKey(sessionId)); +// return s; +// } +// +// /** +// * 获得String类型的key +// * +// * @param +// * @return +// */ +// private String getPreStringKey(Serializable sessionId) { +// String preKey = this.keyPrefix + sessionId; +// return preKey; +// } +// +// public String getKeyPrefix() { +// return keyPrefix; +// } +// +// public void setKeyPrefix(String keyPrefix) { +// this.keyPrefix = keyPrefix; +// } +// +// public void setRedisClient(RedisClient redisClient) { +// this.redisClient = redisClient; +// } +// +// public RedisClient getRedisClient() { +// return redisClient; +// } +// +//} diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/config/ShiroConfig.java b/wisenergy-shiro/src/main/java/com/project/shiro/config/ShiroConfig.java deleted file mode 100644 index eaa1f57..0000000 --- a/wisenergy-shiro/src/main/java/com/project/shiro/config/ShiroConfig.java +++ /dev/null @@ -1,197 +0,0 @@ -package com.project.shiro.config; - -import com.project.shiro.util.AuthenticationFilter; -import com.project.shiro.util.AuthenticationRealm; -import com.project.shiro.util.AuthorizationFilter; -import com.project.shiro.util.redis.ShiroRedisCacheManager; -import com.project.shiro.util.redis.ShiroRedisSessionDAO; -import org.apache.shiro.session.mgt.SessionManager; -import org.apache.shiro.spring.LifecycleBeanPostProcessor; -import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; -import org.apache.shiro.spring.web.ShiroFilterFactoryBean; -import org.apache.shiro.web.mgt.DefaultWebSecurityManager; -import org.apache.shiro.web.servlet.SimpleCookie; -import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.DependsOn; - -import javax.servlet.Filter; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * Description: shiroé…置类 - * User: mxy - * Date: 2019-04-16 - */ -@Configuration -public class ShiroConfig { - - private static final transient Logger logger = LoggerFactory.getLogger(ShiroConfig.class); - - /** - * é…置拦截器 - * <p> - * 定义拦截URLæƒé™ï¼Œä¼˜å…ˆçº§ä»Žä¸Šåˆ°ä¸‹ - * 1). anon : 匿åè®¿é—®ï¼Œæ— éœ€ç™»å½• - * 2). authc : ç™»å½•åŽæ‰èƒ½è®¿é—® - * 3). logout: 登出 - * 4). frameperms : 自定义的过滤器 - * <p> - * URL 匹é…é£Žæ ¼ - * 1). ?:匹é…一个å—符,如 /admin? å°†åŒ¹é… /admin1,但ä¸åŒ¹é… /admin 或 /admin/ï¼› - * 2). *:匹é…零个或多个å—符串,如 /admin* å°†åŒ¹é… /admin 或/admin123,但ä¸åŒ¹é… /admin/1ï¼› - * 3). **:匹é…路径ä¸çš„零个或多个路径,如 /admin/** å°†åŒ¹é… /admin/a 或 /admin/a/b - * <p> - * é…ç½®èº«ä»½éªŒè¯æˆåŠŸï¼Œå¤±è´¥çš„è·³è½¬è·¯å¾„ - */ - @Bean - public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager) { - logger.info("进入Shiro拦截工厂"); - ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); - // 设置securityManager - shiroFilterFactoryBean.setSecurityManager(securityManager); - - // 自定义的过滤器 - Map<String, Filter> filterMap = new HashMap<>(); - // map里é¢key值è¦ä¸ºè¿‡æ»¤å™¨çš„å称,value为过滤器对象 - filterMap.put("authc", authenticationFilter()); - filterMap.put("frameperms", authorizationFilter()); - // å°†è‡ªå®šä¹‰çš„è¿‡æ»¤å™¨åŠ å…¥åˆ°è¿‡æ»¤å™¨é›†åˆä¸ - shiroFilterFactoryBean.setFilters(filterMap); - - // è®¾ç½®æ‹¦æˆªå™¨é›†åˆ - Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>(); - filterChainDefinitionMap.put("/admin/", "anon"); // åŽå°èµ„æº-匿å访问 - filterChainDefinitionMap.put("/admin/res/**", "anon"); // 陿€èµ„æº-匿å访问 - filterChainDefinitionMap.put("/admin/anon/**", "anon"); // åŽå°å¯åŒ¿å访问资æº-匿å访问 - filterChainDefinitionMap.put("/admin/login", "authc"); // 登录页é¢-èº«ä»½è®¤è¯ - filterChainDefinitionMap.put("/admin/logout", "logout"); // 用户退出,åªéœ€é…ç½®logoutå³å¯å®žçŽ°è¯¥åŠŸèƒ½ - filterChainDefinitionMap.put("/admin/common/**", "anon"); // 其他路径å‡éœ€è¦èº«ä»½è®¤è¯ï¼Œä¸€èˆ¬ä½äºŽæœ€ä¸‹é¢ï¼Œä¼˜å…ˆçº§æœ€ä½Ž - filterChainDefinitionMap.put("/admin/**", "authc,frameperms"); // 其他路径å‡éœ€è¦èº«ä»½è®¤è¯ï¼Œä¸€èˆ¬ä½äºŽæœ€ä¸‹é¢ï¼Œä¼˜å…ˆçº§æœ€ä½Ž - - // 设置拦截器 - shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); - shiroFilterFactoryBean.setLoginUrl("/admin/login"); // 登录的路径 -// shiroFilterFactoryBean.setUnauthorizedUrl("/admin/common/unauthorized.jhtml"); // 验è¯å¤±è´¥åŽè·³è½¬çš„路径 - logger.info("Shiro拦截工厂é…置完æˆ"); - return shiroFilterFactoryBean; - } - - /** - * é…ç½®Shiro生命周期处ç†å™¨ - */ - @Bean - public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { - return new LifecycleBeanPostProcessor(); - } - - /** - * 自动创建代ç†ç±»ï¼Œè‹¥ä¸æ·»åŠ ï¼ŒShiro的注解å¯èƒ½ä¸ä¼šç”Ÿæ•ˆã€‚ - */ - @Bean - @DependsOn({"lifecycleBeanPostProcessor"}) - public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() { - DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); - advisorAutoProxyCreator.setProxyTargetClass(true); - return advisorAutoProxyCreator; - } - - /** - * å¼€å¯Shiro的注解 - */ - @Bean - public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() { - AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); - authorizationAttributeSourceAdvisor.setSecurityManager(securityManager()); - return authorizationAttributeSourceAdvisor; - } - - /** - * é…ç½®åŠ å¯†åŒ¹é…,使用MD5的方å¼ï¼Œè¿›è¡Œ1024æ¬¡åŠ å¯† - */ -// @Bean -// public HashedCredentialsMatcher hashedCredentialsMatcher() { -// HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); -// hashedCredentialsMatcher.setHashAlgorithmName("MD5"); -// hashedCredentialsMatcher.setHashIterations(1024); -// return hashedCredentialsMatcher; -// } - - /** - * SecurityManager 安全管ç†å™¨ï¼›Shiroçš„æ ¸å¿ƒ - */ - @Bean - public DefaultWebSecurityManager securityManager() { - DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); - // 自定义的Realm - securityManager.setRealm(authenticationShiroRealm()); - // 缓å˜ç®¡ç† - securityManager.setCacheManager(shiroRedisCacheManager()); - // 会è¯ç®¡ç† - securityManager.setSessionManager(sessionManager()); - return securityManager; - } - - /** - * 自定义Realm,å¯ä»¥å¤šä¸ª - */ - @Bean - public AuthenticationRealm authenticationShiroRealm() { - AuthenticationRealm authenticationRealm = new AuthenticationRealm(); - //authenticationRealm.setCredentialsMatcher(hashedCredentialsMatcher()); - return authenticationRealm; - } - - /** - * redis缓å˜ç®¡ç† - */ - @Bean - public ShiroRedisCacheManager shiroRedisCacheManager() { - return new ShiroRedisCacheManager(); - } - - /** - * 设置session会è¯ç®¡ç†è€… - */ - @Bean - public SessionManager sessionManager() { - DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager(); - defaultWebSessionManager.setSessionIdCookie(simpleCookie()); - defaultWebSessionManager.setSessionDAO(shiroRedisSessionDAO()); - return defaultWebSessionManager; - } - - /** - * sessionç®¡ç† - */ - @Bean - public ShiroRedisSessionDAO shiroRedisSessionDAO() { - return new ShiroRedisSessionDAO(); - } - - /** - * 这里需è¦è®¾ç½®ä¸€ä¸ªcookieçš„åç§° åŽŸå› å°±æ˜¯ä¼šè·ŸåŽŸæ¥çš„sessionçš„id值é‡å¤çš„ - */ - @Bean - public SimpleCookie simpleCookie() { - return new SimpleCookie("SHAREJSESSIONID"); - } - - - @Bean - public AuthenticationFilter authenticationFilter() { - return new AuthenticationFilter(); - } - - @Bean - public AuthorizationFilter authorizationFilter() { - return new AuthorizationFilter(); - } - -} diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationFilter.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationFilter.java deleted file mode 100644 index 62be758..0000000 --- a/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationFilter.java +++ /dev/null @@ -1,275 +0,0 @@ -package com.project.shiro.util; - -import com.alibaba.fastjson.JSONObject; -import org.apache.shiro.authc.AuthenticationException; -import org.apache.shiro.authc.AuthenticationToken; -import org.apache.shiro.subject.Subject; -import org.apache.shiro.util.StringUtils; -import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; -import org.apache.shiro.web.util.WebUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; - -/** - * 自定义表å•认è¯è¿‡æ»¤å™¨ - * - * @author wyy - * @date 2019/07/26 - */ -public class AuthenticationFilter extends FormAuthenticationFilter { - private static final Logger log = LoggerFactory.getLogger(AuthenticationFilter.class); - - //åŠ å¯†å¯†ç 傿•° - private static final String DEFAULT_EN_PASSWORD_PARAM = "enPassword"; - - //默认的登录åç§° - private static final String DEFAULT_USERNAME_PARAM = "loginName"; - - //默认验è¯ç ID傿•° - private static final String DEFAULT_CAPTCHA_ID_PARAM = "captchaId"; - - //默认验è¯ç 傿•° - private static final String DEFAULT_CAPTCHA_PARAM = "captcha"; - - private String captchaIdParam = DEFAULT_CAPTCHA_ID_PARAM; - - private String captchaParam = DEFAULT_CAPTCHA_PARAM; - - private String usernameParam = DEFAULT_USERNAME_PARAM; - - private String enPasswordParam = DEFAULT_EN_PASSWORD_PARAM; - - /** - * 创建token - */ - @Override - protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) { - String loginName = getUsername(request); - String password = getPassword(request); - boolean isRemeberMe = isRememberMe(request); - String ip = getHost(request); - return new com.project.shiro.util.AuthenticationToken(loginName, password, isRemeberMe, ip, "", ""); - } - - /** - * 登录拒ç»ï¼›å¢žåŠ Ajax异æ¥å¤„ç† - * - * @param servletRequest 请求对象 - * @param servletResponse å“应对象 - * @return - * @throws Exception - */ - @Override - protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { - // åˆ¤æ–æ˜¯å¦ä¸ºajax异æ¥è¯·æ±‚ - HttpServletRequest request = (HttpServletRequest) servletRequest; - HttpServletResponse response = (HttpServletResponse) servletResponse; - - // åˆ¤æ–æ˜¯å¦ä¸ºç™»å½•请求 - if (this.isLoginRequest(servletRequest, response)) { - if (this.isLoginSubmission(servletRequest, response)) { - - if (log.isTraceEnabled()) { - log.trace("Login submission detected. Attempting to execute login."); - } - boolean b = executeLogin(servletRequest, response); - return b; - } else { - if (log.isTraceEnabled()) { - log.trace("Login page view."); - } - return true; - } - } else { - if (log.isTraceEnabled()) { - log.trace("Attempting to access a path which requires authentication. Forwarding to the Authentication url [" + this.getLoginUrl() + "]"); - } - - // 异æ¥è¯·æ±‚报错 - if (isAjaxReq(request, response)) { - response.setContentType("application/json"); - response.setCharacterEncoding("UTF-8"); - PrintWriter out = response.getWriter(); - JSONObject json = new JSONObject(); - json.put("result", "fail"); - json.put("msg", "未登录"); - out.println(json); - out.flush(); - out.close(); - return false; - } - -// å¦‚æžœåŒæ¥è¯·æ±‚ç»§ç»æ‰§è¡ŒåŸºç±»æ–¹æ³•ï¼ˆå½“ä¸ºåŒæ¥æ–¹æ³•的时候,基类会直接跳转登录页é¢ï¼‰ - return super.onAccessDenied(request, response); - } - - } - - /** - * é‡å†™ç™»å½•æˆåŠŸçš„æ–¹æ³•ï¼›å¦‚æžœä¸ºå¼‚æ¥è¯·æ±‚,直接返回æˆåŠŸå“应 - * - * @param token - * @param subject - * @param servletRequest - * @param servletResponse - * @return - * @throws Exception - */ - @Override - protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { - // 如果为异æ¥è¯·æ±‚,登录æˆåŠŸåŽï¼Œç›´æŽ¥è¿”回数æ®ï¼Œå‰å°è·³è½¬ç™»å½•åŽçš„页é¢å¤„ç† - if (isAjaxReq(servletRequest, servletResponse)) { - HttpServletResponse response = (HttpServletResponse) servletResponse; - response.setContentType("application/json"); - response.setCharacterEncoding("UTF-8"); - PrintWriter out = response.getWriter(); - JSONObject json = new JSONObject(); - json.put("result", "success"); - json.put("msg", "登录æˆåŠŸ"); - out.write(json.toJSONString()); - out.flush(); - out.close(); - return true; - } - return super.onLoginSuccess(token, subject, servletRequest, servletResponse); - } - - @Override - public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { - //Always return true if the request's method is OPTIONSif (request instanceof HttpServletRequest) { - if (((HttpServletRequest) request).getMethod().toUpperCase().equals("OPTIONS")) { - return true; - } - return super.isAccessAllowed(request, response, mappedValue); - } - - /** - * é‡å†™ç™»å½•失败的方法;如果为异æ¥è¯·æ±‚,直接返回失败å“应 - * - * @param token - * @param e - * @param request - * @param response - * @return - */ - @Override - protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) { - // 如果为异æ¥ç™»å½•,直接返回错误结果 - if (isAjaxReq(request, response)) { - PrintWriter out = null; - try { - response = (HttpServletResponse) response; - response.setContentType("application/json"); - response.setCharacterEncoding("UTF-8"); - out = response.getWriter(); - JSONObject json = new JSONObject(); - if (e.equals("org.apache.shiro.authc.pam.UnsupportedTokenException")) { - String message = "验è¯ç 错误!"; - json.put("result", "fail"); - json.put("msg", message); - } else if (e.equals("org.apache.shiro.authc.UnknownAccountException")) { - String message = "æ¤è´¦å·ä¸å˜åœ¨!"; - json.put("result", "fail"); - json.put("msg", message); - } else if (e.equals("org.apache.shiro.authc.DisabledAccountException")) { - String message = "æ¤è´¦å·å·²è¢«ç¦ç”¨!"; - json.put("result", "fail"); - json.put("msg", message); - } else if (e.equals("org.apache.shiro.authc.LockedAccountException")) { - String message = "æ¤è´¦å·å·²è¢«é”定"; - json.put("result", "fail"); - json.put("msg", message); - } else if (e.equals("org.apache.shiro.authc.IncorrectCredentialsException")) { - String message = "密ç 错误"; - json.put("result", "fail"); - json.put("msg", message); - } else if (e.equals("org.apache.shiro.authc.AuthenticationException")) { - String message = "è´¦å·è®¤è¯å¤±è´¥!"; - json.put("result", "fail"); - json.put("msg", message); - } - out.write(json.toJSONString()); - out.flush(); - out.close(); - return false; - } catch (IOException ex) { - ex.printStackTrace(); - log.error("shiro认è¯å¤±è´¥"); - } - - } - - // åŒæ¥è¯·æ±‚走基类 - return super.onLoginFailure(token, e, request, response); - } - - - /** - * 获å–密ç - * - * @param servletRequest - * @return - */ - @Override - protected String getPassword(ServletRequest servletRequest) { - String parameter = servletRequest.getParameter(enPasswordParam); - HttpServletRequest request = (HttpServletRequest) servletRequest; - String enPasswor = request.getParameter(enPasswordParam); - String password = enPasswor; - return password; - } - - /** - * åˆ¤æ–æ˜¯å¦ä¸ºAjax请求 - * - * @param servletRequest - * @param servletResponse - * @return - */ - public boolean isAjaxReq(ServletRequest servletRequest, ServletResponse servletResponse) { - boolean isAjaxReq = false; - HttpServletRequest request = (HttpServletRequest) servletRequest; - HttpServletResponse response = (HttpServletResponse) servletResponse; - String requestType = request.getHeader("X-Requested-With"); - if (requestType != null && requestType.equalsIgnoreCase("XMLHttpRequest")) { - isAjaxReq = true; - } - return isAjaxReq; - } - - public String getEnPasswordParam() { - return enPasswordParam; - } - - public void setEnPasswordParam(String enPasswordParam) { - this.enPasswordParam = enPasswordParam; - } - - public String getUsernameParam() { - return usernameParam; - } - - public String getCaptchaIdParam() { - return captchaIdParam; - } - - public void setCaptchaIdParam(String captchaIdParam) { - this.captchaIdParam = captchaIdParam; - } - - public String getCaptchaParam() { - return captchaParam; - } - - public void setCaptchaParam(String captchaParam) { - this.captchaParam = captchaParam; - } - -} diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationRealm.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationRealm.java deleted file mode 100644 index ea43120..0000000 --- a/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationRealm.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.project.shiro.util; - -import com.alibaba.fastjson.JSONObject; -import com.project.model.core.Admin; -import com.project.model.core.Menu; -import com.project.model.core.Role; -import com.project.service.core.AdminService; -import com.project.service.core.MenuService; -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang.time.DateUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.shiro.authc.*; -import org.apache.shiro.authz.AuthorizationInfo; -import org.apache.shiro.authz.Permission; -import org.apache.shiro.authz.SimpleAuthorizationInfo; -import org.apache.shiro.realm.AuthorizingRealm; -import org.apache.shiro.subject.PrincipalCollection; - -import javax.annotation.Resource; -import java.io.PrintWriter; -import java.util.*; - -/** - * è®¤è¯ - */ -public class AuthenticationRealm extends AuthorizingRealm { - - @Resource(name = "adminServiceImpl") - private AdminService adminService; - - @Resource(name = "menuServiceImpl") - private MenuService menuService; - - /** - * 获å–认è¯ä¿¡æ¯ - */ - @Override - protected AuthenticationInfo doGetAuthenticationInfo(org.apache.shiro.authc.AuthenticationToken token) { - AuthenticationToken authToken = (AuthenticationToken) token; - // 获å–登录åã€å¯†ç - String username = authToken.getUsername(); - String password = new String(authToken.getPassword()); - - if (username != null && password != null) { - Admin admin = adminService.getByLoginName(username); - - if (admin == null) { - throw new UnknownAccountException(); - } - - if (!admin.getStatus().equals(Admin.STATUS_ENUM.ENABLE.getValue())) { - throw new DisabledAccountException(); - } - - //用户é”定 - if (admin.getIsLocked()) { - - //è´¦å·é”定分钟数 - Date lockedDate = admin.getLockedDate(); - Date unlockedDate = DateUtils.addMinutes(lockedDate, 10); - - //判æ–é”定时间是å¦å·²è¿‡ - if (new Date().after(unlockedDate)) { - admin.setLoginFailCnt(0); - admin.setIsLocked(false); - admin.setLockedDate(null); - adminService.update(admin); - } else { - throw new LockedAccountException(); - } - } - - //密ç 䏿£ç¡® - if (!DigestUtils.md5Hex(password).equals(admin.getLoginPwd())) { - int loginFailCount = admin.getLoginFailCnt() + 1; - if (loginFailCount >= 5) { - admin.setIsLocked(true); - admin.setLockedDate(new Date()); - } - admin.setLoginFailCnt(loginFailCount); - adminService.update(admin); - throw new IncorrectCredentialsException(); - } - admin.setLoginFailCnt(0); - adminService.update(admin); - return new SimpleAuthenticationInfo(new Principal(admin.getId(), username), password, getName()); - } - throw new UnknownAccountException(); - } - - /** - * èŽ·å–æŽˆæƒä¿¡æ¯ - */ - @Override - protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { - - Principal principal = (Principal) principals.fromRealm(getName()).iterator().next(); - - if (principal != null) { - SimpleAuthorizationInfo authInfo = new SimpleAuthorizationInfo(); - - //获å–admin对象 - Admin adminTemp = new Admin(); - adminTemp.setId(principal.getId()); - List<Admin> admins = adminService.getAdminCascadeRole(adminTemp); - Admin admin = admins.get(0); - - //获å–ç”¨æˆ·çš„è§’è‰²ä¿¡æ¯ - Set<String> roleSet = new HashSet<String>(); - for (Role role : admin.getRoles()) { - if (role.getStatus().equals(Role.STATUS_ENUM.ENABLE.getValue())) { - roleSet.add(role.getRoleCode()); - } - } - - //æ ¹æ®è§’色idsèŽ·å–æƒé™ä¿¡æ¯ - List<Menu> menuList = menuService.findOrdinaryMenu(principal.getId()); - Set<String> menuSet = new HashSet<String>(); - for (Menu menu : menuList) { - if (StringUtils.isNotBlank(menu.getCode())) { - menuSet.add(menu.getCode()); - } - } - - //å°†è§’è‰²å’Œèµ„æºæ”¾å…¥æŽˆæƒå¯¹è±¡ä¸ - authInfo.addRoles(roleSet); - authInfo.addStringPermissions(menuSet); - return authInfo; - } - - return null; - } - - /** - * 超级管ç†å‘˜è‡ªåŠ¨èŽ·å–æ‰€æœ‰æƒé™ - */ -// @Override -// public boolean isPermitted(PrincipalCollection principals, String permission) { -//// User user = ((User) principals.getPrimaryPrincipal()); -//// if (Role.ADMIN_FLAG_SUPER_ADMIN == user.getRole().getAdminFlag()) { -//// return true; -//// } -// -// return isPermitted(principals, getPermissionResolver().resolvePermission(permission)); -// } - - @Override - public boolean isPermitted(PrincipalCollection principals, Permission permission) { - AuthorizationInfo info = getAuthorizationInfo(principals); - Collection<Permission> perms = getPermissions(info); - if (CollectionUtils.isEmpty(perms)) { - return false; - } - - for (Permission perm : perms) { - if (perm.implies(permission)) { - return true; - } - } - - return false; - } - - /** - * 踢掉上一个登录的åŒå用户 - * - * @param id 主键 - */ - -// private void stopPreviousSession(Integer id) { -// Collection<Session> sessions = sessionDAO.getActiveSessions(); -// Session currSession = SecurityUtils.getSubject().getSession(); -// Serializable sId = currSession.getId(); -// for (Session session : sessions) { -// SimplePrincipalCollection collection = (SimplePrincipalCollection) session -// .getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); -// if (collection == null) { -// continue; -// } -// -// User u = (User) collection.getPrimaryPrincipal(); -// if (id.equals(u.getId())) { -// if (sId.equals(session.getId())) { -// continue; -// } -// -// session.stop(); -// break; -// } -// } -// } - - -} diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationToken.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationToken.java deleted file mode 100644 index 01bef66..0000000 --- a/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthenticationToken.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.project.shiro.util; - -import org.apache.shiro.authc.UsernamePasswordToken; - -/** - * 登录令牌 - */ -public class AuthenticationToken extends UsernamePasswordToken { - - private static final long serialVersionUID = 4628652632307774263L; - - //验è¯ç ID - private String captchaId; - - //验è¯ç - private String captcha; - - //ipä¿ç•™ - public AuthenticationToken(String loginName, String password, boolean remeberMe, String ip, String captchaId, String caprcha) { - super(loginName, password, remeberMe); - this.captchaId = captchaId; - this.captcha = caprcha; - } - - public String getCaptchaId() { - return captchaId; - } - - public void setCaptchaId(String captchaId) { - this.captchaId = captchaId; - } - - public String getCaptcha() { - return captcha; - } - - public void setCaptcha(String captcha) { - this.captcha = captcha; - } - -} diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthorizationFilter.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthorizationFilter.java deleted file mode 100644 index 3e4192f..0000000 --- a/wisenergy-shiro/src/main/java/com/project/shiro/util/AuthorizationFilter.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.project.shiro.util; - -import com.alibaba.fastjson.JSONObject; -import io.swagger.annotations.ResponseHeader; -import org.apache.commons.lang3.StringUtils; -import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter; - -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; - -/** - * @author wyy - * @date 2019-09-14 17:57 - */ -public class AuthorizationFilter extends PermissionsAuthorizationFilter { - /** - * shiro认è¯perms资æºå¤±è´¥åŽå›žè°ƒæ–¹æ³• - * @param servletRequest - * @param servletResponse - * @return - * @throws IOException - */ - @Override - protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException { - HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; - HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; - String requestedWith = httpServletRequest.getHeader("X-Requested-With"); - if (StringUtils.isNotEmpty(requestedWith) && StringUtils.equals(requestedWith, "XMLHttpRequest")) {//如果是ajaxè¿”å›žæŒ‡å®šæ ¼å¼æ•°æ® - httpServletResponse.setContentType("application/json"); - httpServletResponse.setCharacterEncoding("UTF-8"); - PrintWriter out = httpServletResponse.getWriter(); - JSONObject json = new JSONObject(); - json.put("result", "success"); - json.put("msg", "登录æˆåŠŸ"); - out.write(json.toJSONString()); - out.flush(); - out.close(); - } else {//如果是普通请求进行é‡å®šå‘ - httpServletResponse.sendRedirect("/403"); - } - return false; - } -} diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/Principal.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/Principal.java deleted file mode 100644 index 332eaf4..0000000 --- a/wisenergy-shiro/src/main/java/com/project/shiro/util/Principal.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.project.shiro.util; - -import java.io.Serializable; - -public class Principal implements Serializable { - - private static final long serialVersionUID = 598764316789461315L; - - public Long id; - - public String loginName; - - public Principal(Long id, String loginName) { - this.id = id; - this.loginName = loginName; - } - - public Principal() { - - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getLoginName() { - return loginName; - } - - public void setLoginName(String loginName) { - this.loginName = loginName; - } - -} diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisCache.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisCache.java deleted file mode 100644 index ac97a73..0000000 --- a/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisCache.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.project.shiro.util.redis; - -import cn.wisenergy.service.common.utils.ByteUtil; -import cn.wisenergy.service.common.utils.redis.RedisClient; -import cn.wisenergy.service.common.utils.redis.RedisConsts; -import org.apache.shiro.cache.Cache; -import org.apache.shiro.cache.CacheException; -import org.apache.shiro.util.CollectionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.Resource; -import java.io.IOException; -import java.util.*; - -public class ShiroRedisCache<K, V> implements Cache<K, V> { - - //åˆå§‹åŒ–Log日志 - private Logger logger = LoggerFactory.getLogger(this.getClass()); - - //注入redisClient实例 - @Resource(name = "redisClient") - private RedisClient redisClient; - - //shiroSessionçš„key值å‰ç¼€ - private String keyPrefix; - - //通过redisClient实例和prefix傿•°æž„é€ redisCache - public ShiroRedisCache(RedisClient redisClient, String prefix) { - if (redisClient == null) { - throw new IllegalArgumentException("shiroRedisCaheåˆå§‹åŒ–时,redisClient傿•°ä¸èƒ½ä¸ºç©º"); - } - this.redisClient = redisClient; - this.keyPrefix = prefix; - } - - /** - * 获得String类型的KEY - * - * @param key - * @return - */ - private String getPreStringKey(K key) { - String preKey = null; - if (key instanceof String) { - preKey = this.keyPrefix + key; - return preKey; - } else { - try { - preKey = keyPrefix + ByteUtil.bytesToHexString(ByteUtil.objectToBytes(key)); - } catch (IOException e) { - e.printStackTrace(); - } - return preKey; - } - } - - @Override - public V get(K key) throws CacheException { - logger.debug("æ ¹æ®key从Redisä¸èŽ·å–对象 key [" + key + "]"); - try { - if (key == null) { - return null; - } else { - V Vvalue = (V) redisClient.get(getPreStringKey(key)); - if (Vvalue == null) { - return null; - } - return Vvalue; - } - } catch (Throwable t) { - throw new CacheException(t); - } - - } - - @Override - public V put(K key, V value) throws CacheException { - logger.debug("æ ¹æ®key从å˜å‚¨ key [" + key + "]"); - try { - redisClient.set(getPreStringKey(key), value); - redisClient.setAndExpire(getPreStringKey(key), value, RedisConsts.ADMIN_SHIRO_REALM_EXPIRE); - return value; - } catch (Throwable t) { - throw new CacheException(t); - } - } - - @Override - public V remove(K key) throws CacheException { - logger.debug("从redisä¸åˆ 除 key [" + key + "]"); - try { - V previous = get(key); - redisClient.del(getPreStringKey(key)); - return previous; - } catch (Throwable t) { - throw new CacheException(t); - } - } - - @Override - public void clear() throws CacheException { - logger.debug("从redisä¸åˆ é™¤æ‰€æœ‰å…ƒç´ "); - try { -// redisClient.flushDB(); - } catch (Throwable t) { - throw new CacheException(t); - } - } - - @Override - public int size() { -// try { -// Long longSize = new Long(redisClient.dbSize()); -// return longSize.intValue(); -// } catch (Throwable t) { -// throw new CacheException(t); -// } - return 0; - } - - @SuppressWarnings("unchecked") - @Override - public Set<K> keys() { - try { - Set<byte[]> keys = redisClient.keys(ByteUtil.objectToBytes(this.keyPrefix + "*")); - if (CollectionUtils.isEmpty(keys)) { - return Collections.emptySet(); - } else { - Set<K> newKeys = new HashSet<K>(); - for (byte[] key : keys) { - newKeys.add((K) key); - } - return newKeys; - } - } catch (Throwable t) { - throw new CacheException(t); - } - } - - @Override - public Collection<V> values() { - try { - Set<byte[]> keys = redisClient.keys(ByteUtil.objectToBytes(this.keyPrefix + "*")); - if (!CollectionUtils.isEmpty(keys)) { - List<V> values = new ArrayList<V>(keys.size()); - for (byte[] key : keys) { - @SuppressWarnings("unchecked") - V value = get((K) key); - if (value != null) { - values.add(value); - } - } - return Collections.unmodifiableList(values); - } else { - return Collections.emptyList(); - } - } catch (Throwable t) { - throw new CacheException(t); - } - } - - public String getKeyPrefix() { - return keyPrefix; - } - - public void setKeyPrefix(String keyPrefix) { - this.keyPrefix = keyPrefix; - } - - public RedisClient getRedisClient() { - return redisClient; - } - - public void setRedisClient(RedisClient redisClient) { - this.redisClient = redisClient; - } -} diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisCacheManager.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisCacheManager.java deleted file mode 100644 index 3aa5f43..0000000 --- a/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisCacheManager.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.project.shiro.util.redis; - - -import cn.wisenergy.service.common.utils.redis.RedisClient; -import cn.wisenergy.service.common.utils.redis.RedisConsts; -import org.apache.shiro.cache.Cache; -import org.apache.shiro.cache.CacheException; -import org.apache.shiro.cache.CacheManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.Resource; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -public class ShiroRedisCacheManager implements CacheManager { - - private static final Logger logger = LoggerFactory.getLogger(ShiroRedisCacheManager.class); - - private final ConcurrentMap<String, Cache> caches = new ConcurrentHashMap<String, Cache>(); - - //注入redisClient实例 - @Resource(name = "redisClient") - private RedisClient redisClient; - - /** - * shiroæƒé™ç¼“å˜å‰ç¼€ - */ - private String keyPrefix = RedisConsts.ADMIN_SHIRO_REALM_KEY; - - - @Override - public <K, V> Cache<K, V> getCache(String name) throws CacheException { - - logger.debug("获å–å称为: " + name + " çš„RedisCache实例"); - Cache c = caches.get(keyPrefix + name); - if (c == null) { - c = new ShiroRedisCache<K, V>(redisClient, keyPrefix); - caches.put(keyPrefix + name, c); - } - return c; - } - - public RedisClient getRedisClient() { - return redisClient; - } - - public void setRedisClient(RedisClient redisClient) { - this.redisClient = redisClient; - } - - public String getKeyPrefix() { - return keyPrefix; - } - - public void setKeyPrefix(String keyPrefix) { - this.keyPrefix = keyPrefix; - } -} diff --git a/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisSessionDAO.java b/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisSessionDAO.java deleted file mode 100644 index d921480..0000000 --- a/wisenergy-shiro/src/main/java/com/project/shiro/util/redis/ShiroRedisSessionDAO.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.project.shiro.util.redis; - -import cn.wisenergy.service.common.utils.ByteUtil; -import cn.wisenergy.service.common.utils.redis.RedisClient; -import cn.wisenergy.service.common.utils.redis.RedisConsts; -import org.apache.shiro.session.Session; -import org.apache.shiro.session.UnknownSessionException; -import org.apache.shiro.session.mgt.eis.AbstractSessionDAO; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.Resource; -import java.io.IOException; -import java.io.Serializable; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -public class ShiroRedisSessionDAO extends AbstractSessionDAO { - - private static Logger logger = LoggerFactory.getLogger(ShiroRedisSessionDAO.class); - - //注入redisClient实例 - @Resource(name = "redisClient") - private RedisClient redisClient; - - /** - * shiro-redisçš„session对象å‰ç¼€ - */ - - private String keyPrefix = RedisConsts.ADMIN_SHIRO_SESSION_KEY; - - @Override - public void update(Session session) throws UnknownSessionException { - this.saveSession(session); - } - - private void saveSession(Session session) throws UnknownSessionException { - if (session == null || session.getId() == null) { - logger.error("session or session id is null"); - return; - } - this.redisClient.setAndExpire(this.getPreStringKey(session.getId()), session, RedisConsts.ADMIN_SHIRO_SESSION_EXPIRE); - } - - @Override - public void delete(Session session) { - if (session == null || session.getId() == null) { - logger.error("session or session id is null"); - return; - } - redisClient.del(getPreStringKey(session.getId())); - - } - - @Override - public Collection<Session> getActiveSessions() { - Set<Session> sessions = new HashSet<Session>(); - - Set<byte[]> keys = null; - try { - keys = redisClient.keys(ByteUtil.objectToBytes(this.keyPrefix + "*")); - } catch (IOException e) { - e.printStackTrace(); - } - if (keys != null && keys.size() > 0) { - for (byte[] key : keys) { - Session s = null; - try { - s = (Session) ByteUtil.bytesToObject(redisClient.get(key)); - } catch (IOException e) { - e.printStackTrace(); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - sessions.add(s); - } - } - - return sessions; - } - - @Override - protected Serializable doCreate(Session session) { - Serializable sessionId = this.generateSessionId(session); - this.assignSessionId(session, sessionId); - this.saveSession(session); - return sessionId; - } - - @Override - protected Session doReadSession(Serializable sessionId) { - if (sessionId == null) { - logger.error("session id is null"); - return null; - } - - Session s = (Session) redisClient.get(this.getPreStringKey(sessionId)); - return s; - } - - /** - * 获得String类型的key - * - * @param - * @return - */ - private String getPreStringKey(Serializable sessionId) { - String preKey = this.keyPrefix + sessionId; - return preKey; - } - - public String getKeyPrefix() { - return keyPrefix; - } - - public void setKeyPrefix(String keyPrefix) { - this.keyPrefix = keyPrefix; - } - - public void setRedisClient(RedisClient redisClient) { - this.redisClient = redisClient; - } - - public RedisClient getRedisClient() { - return redisClient; - } - -} diff --git a/wisenergy-shiro/wisenergy-shiro.iml b/wisenergy-shiro/wisenergy-shiro.iml new file mode 100644 index 0000000..b869620 --- /dev/null +++ b/wisenergy-shiro/wisenergy-shiro.iml @@ -0,0 +1,187 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" version="4"> + <component name="FacetManager"> + <facet type="Spring" name="Spring"> + <configuration /> + </facet> + <facet type="web" name="Web"> + <configuration> + <webroots /> + </configuration> + </facet> + </component> + <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8"> + <output url="file://$MODULE_DIR$/target/classes" /> + <output-test url="file://$MODULE_DIR$/target/test-classes" /> + <content url="file://$MODULE_DIR$"> + <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> + <excludeFolder url="file://$MODULE_DIR$/target" /> + </content> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + <orderEntry type="module" module-name="wisenergy-mapper" /> + <orderEntry type="module" module-name="wisenergy-model" /> + <orderEntry type="module" module-name="wisenergy-common" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.5.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.5.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.5.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" /> + <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" /> + <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2" level="project" /> + <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.2" level="project" /> + <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.26" level="project" /> + <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" /> + <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.23" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.5.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.8" level="project" /> + <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.8" level="project" /> + <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.8" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.5.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.19" level="project" /> + <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.19" level="project" /> + <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.19" level="project" /> + <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.16.Final" level="project" /> + <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" /> + <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.7.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.7.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: net.sf.json-lib:json-lib:jdk15:2.4" level="project" /> + <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.8.0" level="project" /> + <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.1" level="project" /> + <orderEntry type="library" name="Maven: net.sf.ezmorph:ezmorph:1.0.6" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.1.5.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: io.undertow:undertow-core:2.0.20.Final" level="project" /> + <orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.3.8.Final" level="project" /> + <orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.3.8.Final" level="project" /> + <orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.0.20.Final" level="project" /> + <orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:1.0.2.Final" level="project" /> + <orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.0.20.Final" level="project" /> + <orderEntry type="library" name="Maven: org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:1.1.3.Final" level="project" /> + <orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" /> + <orderEntry type="library" name="Maven: org.glassfish:javax.el:3.0.0" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.1.5.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.7.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.4" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-test:2.1.5.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-test:2.1.5.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.1.5.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" /> + <orderEntry type="library" name="Maven: net.minidev:json-smart:2.3" level="project" /> + <orderEntry type="library" name="Maven: net.minidev:accessors-smart:1.2" level="project" /> + <orderEntry type="library" name="Maven: junit:junit:4.12" level="project" /> + <orderEntry type="library" name="Maven: org.assertj:assertj-core:3.11.1" level="project" /> + <orderEntry type="library" name="Maven: org.mockito:mockito-core:2.23.4" level="project" /> + <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.12" level="project" /> + <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy-agent:1.9.12" level="project" /> + <orderEntry type="library" name="Maven: org.objenesis:objenesis:2.6" level="project" /> + <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" /> + <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" /> + <orderEntry type="library" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" /> + <orderEntry type="library" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-test:5.1.7.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.xmlunit:xmlunit-core:2.6.2" level="project" /> + <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.2" level="project" /> + <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.1.2" level="project" /> + <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.4" level="project" /> + <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.10" level="project" /> + <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.10" level="project" /> + <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.16" level="project" /> + <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.22" level="project" /> + <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.22" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.1.5.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.1.8.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.1.8.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.1.8.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.7.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.1.7.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.7.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.1.6.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.36.Final" level="project" /> + <orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.36.Final" level="project" /> + <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.36.Final" level="project" /> + <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.36.Final" level="project" /> + <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.36.Final" level="project" /> + <orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.36.Final" level="project" /> + <orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.2.9.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.2" level="project" /> + <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.54" level="project" /> + <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" /> + <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.20" level="project" /> + <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.20" level="project" /> + <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" /> + <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" /> + <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" /> + <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" /> + <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" /> + <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" /> + <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" /> + <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" /> + <orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" /> + <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" level="project" /> + <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.8" level="project" /> + <orderEntry type="library" name="Maven: joda-time:joda-time:2.10.2" level="project" /> + <orderEntry type="library" name="Maven: cn.hutool:hutool-all:4.6.7" level="project" /> + <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-generator:3.4.1" level="project" /> + <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.4.0" level="project" /> + <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.4.0" level="project" /> + <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.4.0" level="project" /> + <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.5" level="project" /> + <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.4.0" level="project" /> + <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.4.0" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.5.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.7.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.apache.velocity:velocity-engine-core:2.0" level="project" /> + <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.4" level="project" /> + <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring-boot-starter:1.4.1" level="project" /> + <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.4.1" level="project" /> + <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.4.1" level="project" /> + <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.4.1" level="project" /> + <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.4.1" level="project" /> + <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.4.1" level="project" /> + <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.4.1" level="project" /> + <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.4.1" level="project" /> + <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.4.1" level="project" /> + <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.4.1" level="project" /> + <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.4.1" level="project" /> + <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.4.1" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.5.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.5.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.7.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.7.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.7.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.7.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.7.RELEASE" level="project" /> + <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8.1" level="project" /> + <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" /> + <orderEntry type="library" name="Maven: commons-pool:commons-pool:1.6" level="project" /> + <orderEntry type="library" name="Maven: commons-io:commons-io:2.6" level="project" /> + <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" /> + <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.4" level="project" /> + <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.11" level="project" /> + <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.8" level="project" /> + <orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.8" level="project" /> + <orderEntry type="library" name="Maven: com.google.guava:guava:22.0" level="project" /> + <orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:1.3.9" level="project" /> + <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.0.18" level="project" /> + <orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.1" level="project" /> + <orderEntry type="library" name="Maven: org.codehaus.mojo:animal-sniffer-annotations:1.14" level="project" /> + <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.68" level="project" /> + <orderEntry type="library" name="Maven: com.alibaba:easyexcel:2.2.6" level="project" /> + <orderEntry type="library" name="Maven: org.apache.poi:poi:3.17" level="project" /> + <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.1" level="project" /> + <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:3.17" level="project" /> + <orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.04" level="project" /> + <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:3.17" level="project" /> + <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:2.6.0" level="project" /> + <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" /> + <orderEntry type="library" name="Maven: cglib:cglib:3.1" level="project" /> + <orderEntry type="library" name="Maven: org.ow2.asm:asm:4.2" level="project" /> + <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.26" level="project" /> + <orderEntry type="library" name="Maven: org.ehcache:ehcache:3.6.3" level="project" /> + <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.2" level="project" /> + </component> +</module> \ No newline at end of file diff --git a/wisenergy-web-admin/pom.xml b/wisenergy-web-admin/pom.xml index 27991ce..cc943bb 100644 --- a/wisenergy-web-admin/pom.xml +++ b/wisenergy-web-admin/pom.xml @@ -22,12 +22,17 @@ <artifactId>wisenergy-service</artifactId> <version>${moduleVersion.wisenergy-service}</version> </dependency> - <dependency> - <groupId>org.apache.shiro</groupId> - <artifactId>shiro-spring</artifactId> - <version>1.4.0</version> + <groupId>cn.wisenergy</groupId> + <artifactId>wisenergy-shiro</artifactId> + <version>${moduleVersion.wisenergy-shiro}</version> </dependency> + + <!--<dependency>--> + <!--<groupId>org.apache.shiro</groupId>--> + <!--<artifactId>shiro-spring</artifactId>--> + <!--<version>1.4.0</version>--> + <!--</dependency>--> </dependencies> <!-- MAVEN构建 --> diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/Application.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/Application.java index aeb4cac..7c3ca84 100644 --- a/wisenergy-web-admin/src/main/java/cn/wisenergy/Application.java +++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/Application.java @@ -1,5 +1,8 @@ package cn.wisenergy; +import org.apache.shiro.spring.boot.autoconfigure.ShiroAnnotationProcessorAutoConfiguration; +import org.apache.shiro.spring.boot.autoconfigure.ShiroAutoConfiguration; +import org.apache.shiro.spring.boot.autoconfigure.ShiroBeanAutoConfiguration; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -13,7 +16,7 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; */ @EnableCaching //排除原有的Multiparté…ç½® spingboot接å—ä¸äº†multipartfile傿•° -@SpringBootApplication(exclude = {MultipartAutoConfiguration.class}) +@SpringBootApplication(exclude = {MultipartAutoConfiguration.class, ShiroAnnotationProcessorAutoConfiguration.class, ShiroAutoConfiguration.class, ShiroBeanAutoConfiguration.class}) @MapperScan(basePackages = "cn.wisenergy.mapper") @EnableSwagger2 @EnableScheduling diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/WorkUserController.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/WorkUserController.java index 95f02e8..44c3ea3 100644 --- a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/WorkUserController.java +++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/WorkUserController.java @@ -11,12 +11,14 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; +import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; /** * @description: @@ -50,12 +52,15 @@ public class WorkUserController extends BaseController { @ApiImplicitParam(name = "source", value = "ç™»å½•æ¥æºï¼šPC/WAP", dataType = "string", required = true) }) @GetMapping(value = "/login") - public Result<ResultUser> login(String loginName, String password, String source, HttpServletRequest request) { + public Result login(String loginName, String password, String source, HttpServletRequest request, HttpServletResponse response) { log.info("WorkUserController[]login[]input.param" + loginName + password + source); if (StringUtils.isEmpty(loginName) || StringUtils.isEmpty(password) || StringUtils.isEmpty(source)) { throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL); } - ResultUser resultUser = workUserService.login(loginName, password, source, request); + ResultUser resultUser = workUserService.login(loginName, password, source); + String sessionId = request.getSession().getId(); + response.setHeader("sessionId", sessionId); + response.setHeader("Access-Control-Expose-Headers", "sessionId"); return getResult(resultUser); } @@ -77,10 +82,41 @@ public class WorkUserController extends BaseController { @ApiOperation(value = "组织架构", notes = "组织架构", httpMethod = "GET") @GetMapping(value = "/getOrganizationStructureDto") - public Result<OrganizationDto> getOrganizationStructureDto(){ + public Result<OrganizationDto> getOrganizationStructureDto() { log.info("WorkUserController[]getOrganizationStructureDto[]"); OrganizationDto organizationDto = workUserService.getOrganizationStructure(); return getResult(organizationDto); } + @ApiOperation(value = "PC端登出", notes = "PC端登出") + @GetMapping("/PCLogout") + public Result logout() { + SecurityUtils.getSubject().logout(); + return getResult(null); + } + + @ApiOperation(value = "微信登出", notes = "微信登出") + @GetMapping("/wxLogout") + public Result wxLogout(Integer userId) { + log.info("UserController[]wxLogout[].input.para{}userId" + userId); + workUserService.wxLogout(userId); + return getResult(null); + } + + @ApiOperation(value = "微信登录", notes = "微信登录") + @GetMapping("/wxLogin") + public Result wxLogin(String code) { + log.info("UserController[]wxLogin[]input.param{}"); + ResultUser user = workUserService.weChatLogin(code); + return getResult(user); + } + + @ApiOperation(value = "用户绑定微信openid", notes = "用户绑定微信openid") + @GetMapping("/bindWeChat") + public Result bindWeChat(Integer userId, String code) { + log.info("UserController[]binWeChat[]input.param{}userId,code" + userId + "," + code); + boolean b = workUserService.bindWeChat(userId, code); + return getResult(b); + } + } diff --git a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/hanlder/LoginFilter.java b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/hanlder/LoginFilter.java index 4d23b45..5628eac 100644 --- a/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/hanlder/LoginFilter.java +++ b/wisenergy-web-admin/src/main/java/cn/wisenergy/web/config/hanlder/LoginFilter.java @@ -1,62 +1,79 @@ -package cn.wisenergy.web.config.hanlder; - -import cn.wisenergy.common.utils.exception.BASE_RESP_CODE_ENUM; -import cn.wisenergy.common.utils.exception.BaseCustomException; -import org.springframework.stereotype.Component; - -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; -import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -/** - * @description: - * @author: nh - * @create: 2021-04-01 10:44 - **/ -@Component -public class LoginFilter implements Filter { - - private final static List<String> URI_LIST = Arrays.asList("/login","/webjars","/swagger-resources", - "/null","/v2","/swagger-ui.html","/work/collect","/work/order/addOrder","/work/order/examine","/work/order/getDeptNotOrderInfo", - "/work/order/getExamineApplets","/work/order/getProject","/work/order/noSubmit","/work/order/query","/work/order/reject", - "/changePassword","getUserInfo","/statistics/getCurrentMonthWorkTimeCollect","/statistics/getMonthlyWorkingHours"); - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - HttpServletRequest httpServletRequest = (HttpServletRequest) request; - HttpSession session = httpServletRequest.getSession(); - - ServletContext application = session.getServletContext(); - Map<String, String> loginMap = (Map<String, String>) application.getAttribute("loginMap"); - // 请求接å£ä¸ä¸ºç™»å½•å†è¿‡æ»¤ - String requestURI = ((HttpServletRequest) request).getRequestURI(); - for (String s : URI_LIST) { - if (requestURI.startsWith(s)) { - chain.doFilter(request,response); - return; - } - } - if (loginMap == null) { - throw new BaseCustomException(BASE_RESP_CODE_ENUM.PLEASE_RE_LOGIN); - } - Collection<String> values = loginMap.values(); - if (!values.contains(session.getId())) { - throw new BaseCustomException(BASE_RESP_CODE_ENUM.PLEASE_RE_LOGIN); - } - } - - @Override - public void destroy() { - - } -} +//package cn.wisenergy.web.config.hanlder; +// +//import cn.wisenergy.common.utils.RedisUtil; +//import cn.wisenergy.common.utils.exception.BASE_RESP_CODE_ENUM; +//import cn.wisenergy.common.utils.exception.BaseCustomException; +//import org.apache.commons.lang.StringUtils; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Component; +// +//import javax.servlet.*; +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpSession; +//import java.io.IOException; +//import java.util.Arrays; +//import java.util.List; +// +///** +// * @description: +// * @author: nh +// * @create: 2021-04-01 10:44 +// **/ +//@Component +//public class LoginFilter implements Filter { +// +// @Autowired +// private RedisUtil redisUtil; +// +// private static final int SESSION_EXPIRE = 30 * 60; +// +// private final static List<String> URI_LIST = Arrays.asList("/login","/webjars","/swagger-resources", +// "/null","/v2","/swagger-ui.html","/work/collect","/work/order/addOrder","/work/order/examine","/work/order/getDeptNotOrderInfo", +// "/work/order/getExamineApplets","/work/order/getProject","/work/order/noSubmit","/work/order/query","/work/order/reject", +// "/changePassword","/getUserInfo","/statistics/getCurrentMonthWorkTimeCollect","/statistics/getMonthlyWorkingHours"); +// +// @Override +// public void init(FilterConfig filterConfig) throws ServletException { +// +// } +// +// @Override +// public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { +// HttpServletRequest httpServletRequest = (HttpServletRequest) request; +// HttpSession session = httpServletRequest.getSession(false); +// +// // 请求接å£ä¸ä¸ºæŒ‡å®šæŽ¥å£å†è¿‡æ»¤ +// String requestURI = ((HttpServletRequest) request).getRequestURI(); +// System.out.println("requestURI = " + requestURI); +// for (String s : URI_LIST) { +// if (requestURI.startsWith(s)) { +// chain.doFilter(request,response); +// return; +// } +// } +// +// // 请求没有æºå¸¦session +// if (session == null) { +// System.out.println("session Is Null"); +// throw new BaseCustomException(BASE_RESP_CODE_ENUM.PLEASE_RE_LOGIN); +// } +// System.out.println("session.getId() = " + session.getId()); +// // 获å–redisä¸å˜å‚¨çš„ç™»å½•æ—¶å˜æ”¾çš„session +// String sessionCache = redisUtil.get(session.getId()); +// // session为空,session与登录时的sessionä¸ä¸€è‡´æç¤ºé‡æ–°ç™»å½•,ä¸ä¸ºç©ºåˆ™è¿›è¡Œä¸‹ä¸€ä¸ªè¿‡æ»¤ +// if (StringUtils.isBlank(sessionCache)) { +// throw new BaseCustomException(BASE_RESP_CODE_ENUM.PLEASE_RE_LOGIN); +// } else if (!sessionCache.equals(session)) { +// throw new BaseCustomException(BASE_RESP_CODE_ENUM.PLEASE_RE_LOGIN); +// } else { +// redisUtil.set(session.getId(), session.toString(), SESSION_EXPIRE); +// chain.doFilter(request, response); +// } +// +// } +// +// @Override +// public void destroy() { +// +// } +//} -- 2.18.1