From 5b3724e252f51d3b4465d47320362b866170f4e8 Mon Sep 17 00:00:00 2001 From: zwzw1219 Date: Thu, 30 Nov 2017 10:23:30 +0800 Subject: [PATCH] =?UTF-8?q?!4=20token=E9=87=8D=E6=9E=84=20Merge=20pull=20r?= =?UTF-8?q?equest=20!4=20from=20zwzw1219/token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/boot/security/server/dao/RoleDao.java | 5 +-- .../boot/security/server/dto/LoginUser.java | 20 ++++++++++ .../com/boot/security/server/dto/Token.java | 13 +++++- .../security/server/filter/TokenFilter.java | 24 +++++++++++ .../security/server/service/TokenService.java | 4 +- .../security/server/service/UserService.java | 3 -- .../service/impl/PermissionServiceImpl.java | 13 ------ .../server/service/impl/RoleServiceImpl.java | 13 ------ .../server/service/impl/TokenServiceImpl.java | 40 +++++++------------ .../server/service/impl/UserServiceImpl.java | 38 ------------------ src/main/resources/application.yml | 2 +- 11 files changed, 73 insertions(+), 102 deletions(-) diff --git a/src/main/java/com/boot/security/server/dao/RoleDao.java b/src/main/java/com/boot/security/server/dao/RoleDao.java index 4ecfd47..1910618 100644 --- a/src/main/java/com/boot/security/server/dao/RoleDao.java +++ b/src/main/java/com/boot/security/server/dao/RoleDao.java @@ -2,7 +2,6 @@ package com.boot.security.server.dao; import java.util.List; import java.util.Map; -import java.util.Set; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; @@ -48,7 +47,5 @@ public interface RoleDao { @Delete("delete from sys_role_user where roleId = #{roleId}") int deleteRoleUser(Long roleId); - - @Select("select ru.userId from sys_role r inner join sys_role_user ru on r.id = ru.roleId where ru.roleId = #{roleId}") - Set listUserIds(Long roleId); + } diff --git a/src/main/java/com/boot/security/server/dto/LoginUser.java b/src/main/java/com/boot/security/server/dto/LoginUser.java index c0f11bd..9b2a481 100644 --- a/src/main/java/com/boot/security/server/dto/LoginUser.java +++ b/src/main/java/com/boot/security/server/dto/LoginUser.java @@ -19,6 +19,10 @@ public class LoginUser extends SysUser implements UserDetails { private List permissions; private String token; + /** 登陆时间戳(毫秒) */ + private Long loginTime; + /** 过期时间戳 */ + private Long expireTime; public List getPermissions() { return permissions; @@ -71,4 +75,20 @@ public class LoginUser extends SysUser implements UserDetails { return true; } + public Long getLoginTime() { + return loginTime; + } + + public void setLoginTime(Long loginTime) { + this.loginTime = loginTime; + } + + public Long getExpireTime() { + return expireTime; + } + + public void setExpireTime(Long expireTime) { + this.expireTime = expireTime; + } + } diff --git a/src/main/java/com/boot/security/server/dto/Token.java b/src/main/java/com/boot/security/server/dto/Token.java index 7430af7..e6938c6 100644 --- a/src/main/java/com/boot/security/server/dto/Token.java +++ b/src/main/java/com/boot/security/server/dto/Token.java @@ -14,10 +14,13 @@ public class Token implements Serializable { private static final long serialVersionUID = 6314027741784310221L; private String token; + /** 登陆时间戳(毫秒) */ + private Long loginTime; - public Token(String token) { + public Token(String token, Long loginTime) { super(); this.token = token; + this.loginTime = loginTime; } public String getToken() { @@ -28,4 +31,12 @@ public class Token implements Serializable { this.token = token; } + public Long getLoginTime() { + return loginTime; + } + + public void setLoginTime(Long loginTime) { + this.loginTime = loginTime; + } + } diff --git a/src/main/java/com/boot/security/server/filter/TokenFilter.java b/src/main/java/com/boot/security/server/filter/TokenFilter.java index b6a9243..22afb64 100644 --- a/src/main/java/com/boot/security/server/filter/TokenFilter.java +++ b/src/main/java/com/boot/security/server/filter/TokenFilter.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @@ -31,6 +32,9 @@ public class TokenFilter extends OncePerRequestFilter { @Autowired private TokenService tokenService; + @Autowired + private UserDetailsService userDetailsService; + private static final Long MINUTES_10 = 10 * 60 * 1000L; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) @@ -39,6 +43,7 @@ public class TokenFilter extends OncePerRequestFilter { if (StringUtils.isNotBlank(token)) { LoginUser loginUser = tokenService.getLoginUser(token); if (loginUser != null) { + loginUser = checkLoginTime(loginUser); UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(authentication); @@ -48,6 +53,25 @@ public class TokenFilter extends OncePerRequestFilter { filterChain.doFilter(request, response); } + /** + * 校验时间
+ * 过期时间与当前时间对比,临近过期10分钟内的话,自动刷新缓存 + * + * @param loginUser + * @return + */ + private LoginUser checkLoginTime(LoginUser loginUser) { + long expireTime = loginUser.getExpireTime(); + long currentTime = System.currentTimeMillis(); + if (expireTime - currentTime <= MINUTES_10) { + String token = loginUser.getToken(); + loginUser = (LoginUser) userDetailsService.loadUserByUsername(loginUser.getUsername()); + loginUser.setToken(token); + tokenService.refresh(loginUser); + } + return loginUser; + } + /** * 根据参数或者header获取token * diff --git a/src/main/java/com/boot/security/server/service/TokenService.java b/src/main/java/com/boot/security/server/service/TokenService.java index 099a61a..6b1dc98 100644 --- a/src/main/java/com/boot/security/server/service/TokenService.java +++ b/src/main/java/com/boot/security/server/service/TokenService.java @@ -14,12 +14,10 @@ public interface TokenService { Token saveToken(LoginUser loginUser); - void updateLoginUser(LoginUser loginUser); + void refresh(LoginUser loginUser); LoginUser getLoginUser(String token); boolean deleteToken(String token); - String getTokenByUserId(Long userId); - } diff --git a/src/main/java/com/boot/security/server/service/UserService.java b/src/main/java/com/boot/security/server/service/UserService.java index 58fafd5..1528d92 100644 --- a/src/main/java/com/boot/security/server/service/UserService.java +++ b/src/main/java/com/boot/security/server/service/UserService.java @@ -1,7 +1,5 @@ package com.boot.security.server.service; -import java.util.Set; - import com.boot.security.server.dto.UserDto; import com.boot.security.server.model.SysUser; @@ -15,5 +13,4 @@ public interface UserService { void changePassword(String username, String oldPassword, String newPassword); - void updateLoginUserCache(Set userIds); } diff --git a/src/main/java/com/boot/security/server/service/impl/PermissionServiceImpl.java b/src/main/java/com/boot/security/server/service/impl/PermissionServiceImpl.java index 7df079f..fc9aea4 100644 --- a/src/main/java/com/boot/security/server/service/impl/PermissionServiceImpl.java +++ b/src/main/java/com/boot/security/server/service/impl/PermissionServiceImpl.java @@ -1,7 +1,5 @@ package com.boot.security.server.service.impl; -import java.util.Set; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -11,7 +9,6 @@ import org.springframework.transaction.annotation.Transactional; import com.boot.security.server.dao.PermissionDao; import com.boot.security.server.model.Permission; import com.boot.security.server.service.PermissionService; -import com.boot.security.server.service.UserService; @Service public class PermissionServiceImpl implements PermissionService { @@ -20,8 +17,6 @@ public class PermissionServiceImpl implements PermissionService { @Autowired private PermissionDao permissionDao; - @Autowired - private UserService userService; @Override public void save(Permission permission) { @@ -32,25 +27,17 @@ public class PermissionServiceImpl implements PermissionService { @Override public void update(Permission permission) { - Set userIds = listUserIds(permission.getId()); permissionDao.update(permission); - userService.updateLoginUserCache(userIds); } @Override @Transactional public void delete(Long id) { - Set userIds = listUserIds(id); permissionDao.deleteRolePermission(id); permissionDao.delete(id); permissionDao.deleteByParentId(id); log.debug("删除菜单id:{}", id); - userService.updateLoginUserCache(userIds); - } - - private Set listUserIds(Long permissionId) { - return permissionDao.listUserIds(permissionId); } } diff --git a/src/main/java/com/boot/security/server/service/impl/RoleServiceImpl.java b/src/main/java/com/boot/security/server/service/impl/RoleServiceImpl.java index caf2482..fd427e8 100644 --- a/src/main/java/com/boot/security/server/service/impl/RoleServiceImpl.java +++ b/src/main/java/com/boot/security/server/service/impl/RoleServiceImpl.java @@ -1,7 +1,6 @@ package com.boot.security.server.service.impl; import java.util.List; -import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,7 +13,6 @@ import com.boot.security.server.dao.RoleDao; import com.boot.security.server.dto.RoleDto; import com.boot.security.server.model.Role; import com.boot.security.server.service.RoleService; -import com.boot.security.server.service.UserService; @Service public class RoleServiceImpl implements RoleService { @@ -23,8 +21,6 @@ public class RoleServiceImpl implements RoleService { @Autowired private RoleDao roleDao; - @Autowired - private UserService userService; @Override @Transactional @@ -60,31 +56,22 @@ public class RoleServiceImpl implements RoleService { } roleDao.update(role); - Set userIds = listUserIds(role.getId()); roleDao.deleteRolePermission(role.getId()); if (!CollectionUtils.isEmpty(permissionIds)) { roleDao.saveRolePermission(role.getId(), permissionIds); } log.debug("修改角色{}", role.getName()); - - userService.updateLoginUserCache(userIds); } @Override @Transactional public void deleteRole(Long id) { - Set userIds = listUserIds(id); roleDao.deleteRolePermission(id); roleDao.deleteRoleUser(id); roleDao.delete(id); log.debug("删除角色id:{}", id); - userService.updateLoginUserCache(userIds); - } - - private Set listUserIds(Long roleId) { - return roleDao.listUserIds(roleId); } } diff --git a/src/main/java/com/boot/security/server/service/impl/TokenServiceImpl.java b/src/main/java/com/boot/security/server/service/impl/TokenServiceImpl.java index 6e2810e..ef92d9b 100644 --- a/src/main/java/com/boot/security/server/service/impl/TokenServiceImpl.java +++ b/src/main/java/com/boot/security/server/service/impl/TokenServiceImpl.java @@ -7,7 +7,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; -import org.springframework.util.StringUtils; import com.boot.security.server.dto.LoginUser; import com.boot.security.server.dto.Token; @@ -25,32 +24,33 @@ public class TokenServiceImpl implements TokenService { @Autowired private RedisTemplate redisTemplate; @Autowired - private RedisTemplate idTokenRedisTemplate; - @Autowired private SysLogService logService; @Override public Token saveToken(LoginUser loginUser) { - String token = getTokenByUserId(loginUser.getId()); - if (StringUtils.isEmpty(token)) { - token = UUID.randomUUID().toString(); - } + String token = UUID.randomUUID().toString(); loginUser.setToken(token); - updateLoginUser(loginUser); + cacheLoginUser(loginUser); + // 登陆日志 logService.save(loginUser.getId(), "登陆", true, null); - return new Token(token); + return new Token(token, loginUser.getLoginTime()); + } + + private void cacheLoginUser(LoginUser loginUser) { + loginUser.setLoginTime(System.currentTimeMillis()); + loginUser.setExpireTime(loginUser.getLoginTime() + expireSeconds * 1000); + // 缓存 + redisTemplate.boundValueOps(getTokenKey(loginUser.getToken())).set(loginUser, expireSeconds, TimeUnit.SECONDS); } /** * 更新缓存的用户信息 */ @Override - public void updateLoginUser(LoginUser loginUser) { - redisTemplate.boundValueOps(getTokenKey(loginUser.getToken())).set(loginUser, expireSeconds, TimeUnit.SECONDS); - idTokenRedisTemplate.boundValueOps(getUserIdKey(loginUser.getId())).set(loginUser.getToken(), expireSeconds, - TimeUnit.SECONDS); + public void refresh(LoginUser loginUser) { + cacheLoginUser(loginUser); } @Override @@ -64,7 +64,7 @@ public class TokenServiceImpl implements TokenService { LoginUser loginUser = redisTemplate.opsForValue().get(key); if (loginUser != null) { redisTemplate.delete(key); - redisTemplate.delete(getUserIdKey(loginUser.getId())); + // 退出日志 logService.save(loginUser.getId(), "退出", true, null); return true; @@ -77,16 +77,4 @@ public class TokenServiceImpl implements TokenService { return "tokens:" + token; } - private String getUserIdKey(Long userId) { - return "users:id:" + userId; - } - - /** - * 根据userId获取token - */ - @Override - public String getTokenByUserId(Long userId) { - return idTokenRedisTemplate.opsForValue().get(getUserIdKey(userId)); - } - } diff --git a/src/main/java/com/boot/security/server/service/impl/UserServiceImpl.java b/src/main/java/com/boot/security/server/service/impl/UserServiceImpl.java index 0fdd24d..166d23f 100644 --- a/src/main/java/com/boot/security/server/service/impl/UserServiceImpl.java +++ b/src/main/java/com/boot/security/server/service/impl/UserServiceImpl.java @@ -1,28 +1,20 @@ package com.boot.security.server.service.impl; import java.util.List; -import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; -import com.boot.security.server.dao.PermissionDao; import com.boot.security.server.dao.UserDao; -import com.boot.security.server.dto.LoginUser; import com.boot.security.server.dto.UserDto; -import com.boot.security.server.model.Permission; import com.boot.security.server.model.SysUser; import com.boot.security.server.model.SysUser.Status; -import com.boot.security.server.service.TokenService; import com.boot.security.server.service.UserService; -import com.google.common.collect.Sets; @Service public class UserServiceImpl implements UserService { @@ -33,10 +25,6 @@ public class UserServiceImpl implements UserService { private UserDao userDao; @Autowired private BCryptPasswordEncoder passwordEncoder; - @Autowired - private PermissionDao permissionDao; - @Autowired - private TokenService tokenService; @Override @Transactional @@ -86,34 +74,8 @@ public class UserServiceImpl implements UserService { public SysUser updateUser(UserDto userDto) { userDao.update(userDto); saveUserRoles(userDto.getId(), userDto.getRoleIds()); - updateLoginUserCache(Sets.newHashSet(userDto.getId())); return userDto; } - /** - * 修改登陆用户的缓存 - */ - @Override - public void updateLoginUserCache(Set userIds) { - if (CollectionUtils.isEmpty(userIds)) { - return; - } - - userIds.parallelStream().forEach(userId -> { - String token = tokenService.getTokenByUserId(userId); - if (!StringUtils.isEmpty(token)) { - SysUser sysUser = userDao.getById(userId); - - LoginUser loginUser = new LoginUser(); - loginUser.setToken(token); - BeanUtils.copyProperties(sysUser, loginUser); - - List permissions = permissionDao.listByUserId(sysUser.getId()); - loginUser.setPermissions(permissions); - - tokenService.updateLoginUser(loginUser); - } - }); - } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a1b8f5c..fa4f68c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -56,6 +56,6 @@ log: maxsize: 30MB token: expire: - seconds: 86400 + seconds: 7200 server: port: 8080 \ No newline at end of file -- Gitee