【7.6.0】【auth】调整登录接口,移除cookie的创建

pull/55/head
fengshuonan 2023-05-11 22:38:59 +08:00
parent c408bb2e0f
commit e377ef5a90
11 changed files with 12 additions and 201 deletions

View File

@ -48,7 +48,7 @@ public interface SessionManagerApi {
* @author fengshuonan * @author fengshuonan
* @since 2020/10/19 16:47 * @since 2020/10/19 16:47
*/ */
void createSession(String token, LoginUser loginUser, Boolean createCookie); void createSession(String token, LoginUser loginUser);
/** /**
* loginUser * loginUser
@ -109,16 +109,6 @@ public interface SessionManagerApi {
*/ */
void refreshSession(String token); void refreshSession(String token);
/**
* cookie
* <p>
*
*
* @author fengshuonan
* @since 2021/1/2 20:25
*/
void destroySessionCookie();
/** /**
* 线 * 线
* *

View File

@ -1,65 +0,0 @@
/*
* Copyright [2020-2030] [https://www.stylefeng.cn]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* GunsAPACHE LICENSE 2.0使
*
* 1.LICENSE
* 2.Guns
* 3.
* 4. https://gitee.com/stylefeng/guns
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.auth.api.cookie;
import javax.servlet.http.Cookie;
/**
* cookiesessionhttpServletResponsecookie
* <p>
*
*
* @author fengshuonan
* @since 2020/12/27 13:28
*/
public abstract class SessionCookieCreator {
/**
* cookie
* <p>
*
*
* @param cookieName cookie
* @param cookieValue cookie
* @param sessionExpiredSeconds cookie
* @author fengshuonan
* @since 2020/12/27 13:29
*/
public Cookie createCookie(String cookieName, String cookieValue, Integer sessionExpiredSeconds) {
Cookie cookie = new Cookie(cookieName, cookieValue);
cookie.setMaxAge(sessionExpiredSeconds);
this.expandCookieProp(cookie);
return cookie;
}
/**
* cookie
*
* @author fengshuonan
* @since 2020/12/27 13:41
*/
public abstract void expandCookieProp(Cookie cookie);
}

View File

@ -74,12 +74,6 @@ public class LoginRequest extends BaseRequest {
@ChineseDescription("用户输入的验证码的值") @ChineseDescription("用户输入的验证码的值")
private String verCode; private String verCode;
/**
* cookie
*/
@ChineseDescription("是否写入cookie会话信息")
private Boolean createCookie = false;
/** /**
* *
*/ */

View File

@ -216,7 +216,6 @@ public class AuthServiceImpl implements AuthServiceApi {
} }
logoutWithToken(token); logoutWithToken(token);
sessionManagerApi.destroySessionCookie();
} }
@Override @Override
@ -428,7 +427,7 @@ public class AuthServiceImpl implements AuthServiceApi {
loginUser.setWsUrl(WebSocketConfigExpander.getWebSocketWsUrl()); loginUser.setWsUrl(WebSocketConfigExpander.getWebSocketWsUrl());
// 10. 缓存用户信息,创建会话 // 10. 缓存用户信息,创建会话
sessionManagerApi.createSession(jwtToken, loginUser, loginRequest.getCreateCookie()); sessionManagerApi.createSession(jwtToken, loginUser);
// 11. 如果开启了单账号单端在线,则踢掉已经上线的该用户 // 11. 如果开启了单账号单端在线,则踢掉已经上线的该用户
if (AuthConfigExpander.getSingleAccountLoginFlag()) { if (AuthConfigExpander.getSingleAccountLoginFlag()) {

View File

@ -25,20 +25,14 @@
package cn.stylefeng.roses.kernel.auth.session; package cn.stylefeng.roses.kernel.auth.session;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi; import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi;
import cn.stylefeng.roses.kernel.auth.api.cookie.SessionCookieCreator;
import cn.stylefeng.roses.kernel.auth.api.expander.AuthConfigExpander;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser; import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
import cn.stylefeng.roses.kernel.message.api.expander.WebSocketConfigExpander; import cn.stylefeng.roses.kernel.message.api.expander.WebSocketConfigExpander;
import cn.stylefeng.roses.kernel.rule.callback.ConfigUpdateCallback; import cn.stylefeng.roses.kernel.rule.callback.ConfigUpdateCallback;
import cn.stylefeng.roses.kernel.rule.util.HttpServletUtil;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.*; import java.util.*;
import static cn.stylefeng.roses.kernel.message.api.constants.MessageConstants.WEB_SOCKET_WS_URL_CONFIG_CODE; import static cn.stylefeng.roses.kernel.message.api.constants.MessageConstants.WEB_SOCKET_WS_URL_CONFIG_CODE;
@ -74,23 +68,16 @@ public class DefaultSessionManager implements SessionManagerApi, ConfigUpdateCal
*/ */
private final Long sessionExpiredSeconds; private final Long sessionExpiredSeconds;
/**
* cookiesessionresponsecookie
*/
private final SessionCookieCreator sessionCookieCreator;
public DefaultSessionManager(CacheOperatorApi<LoginUser> loginUserCache, public DefaultSessionManager(CacheOperatorApi<LoginUser> loginUserCache,
CacheOperatorApi<Set<String>> allPlaceLoginTokenCache, CacheOperatorApi<Set<String>> allPlaceLoginTokenCache,
Long sessionExpiredSeconds, Long sessionExpiredSeconds) {
SessionCookieCreator sessionCookieCreator) {
this.loginUserCache = loginUserCache; this.loginUserCache = loginUserCache;
this.allPlaceLoginTokenCache = allPlaceLoginTokenCache; this.allPlaceLoginTokenCache = allPlaceLoginTokenCache;
this.sessionExpiredSeconds = sessionExpiredSeconds; this.sessionExpiredSeconds = sessionExpiredSeconds;
this.sessionCookieCreator = sessionCookieCreator;
} }
@Override @Override
public void createSession(String token, LoginUser loginUser, Boolean createCookie) { public void createSession(String token, LoginUser loginUser) {
// 装配用户信息的缓存 // 装配用户信息的缓存
loginUserCache.put(token, loginUser, sessionExpiredSeconds); loginUserCache.put(token, loginUser, sessionExpiredSeconds);
@ -102,15 +89,6 @@ public class DefaultSessionManager implements SessionManagerApi, ConfigUpdateCal
} }
theUserTokens.add(token); theUserTokens.add(token);
allPlaceLoginTokenCache.put(loginUser.getUserId().toString(), theUserTokens); allPlaceLoginTokenCache.put(loginUser.getUserId().toString(), theUserTokens);
// 如果开启了cookie存储会话信息则需要给HttpServletResponse添加一个cookie
if (createCookie) {
String sessionCookieName = AuthConfigExpander.getSessionCookieName();
Cookie cookie = sessionCookieCreator.createCookie(sessionCookieName, token, Convert.toInt(AuthConfigExpander.getAuthJwtTimeoutSeconds()));
HttpServletResponse response = HttpServletUtil.getResponse();
response.addCookie(cookie);
}
} }
@Override @Override
@ -193,15 +171,6 @@ public class DefaultSessionManager implements SessionManagerApi, ConfigUpdateCal
} }
} }
@Override
public void destroySessionCookie() {
// 如果开启了cookie存储会话信息则需要给HttpServletResponse添加一个cookie
String sessionCookieName = AuthConfigExpander.getSessionCookieName();
Cookie cookie = sessionCookieCreator.createCookie(sessionCookieName, null, 0);
HttpServletResponse response = HttpServletUtil.getResponse();
response.addCookie(cookie);
}
@Override @Override
public List<LoginUser> onlineUserList() { public List<LoginUser> onlineUserList() {
Map<String, LoginUser> allKeyValues = loginUserCache.getAllKeyValues(); Map<String, LoginUser> allKeyValues = loginUserCache.getAllKeyValues();

View File

@ -1,47 +0,0 @@
/*
* Copyright [2020-2030] [https://www.stylefeng.cn]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* GunsAPACHE LICENSE 2.0使
*
* 1.LICENSE
* 2.Guns
* 3.
* 4. https://gitee.com/stylefeng/guns
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.auth.session.cookie;
import cn.stylefeng.roses.kernel.auth.api.cookie.SessionCookieCreator;
import javax.servlet.http.Cookie;
/**
* cookie
* <p>
* expandCookiePropcookie
*
* @author fengshuonan
* @since 2020/12/27 13:29
*/
public class DefaultSessionCookieCreator extends SessionCookieCreator {
@Override
public void expandCookieProp(Cookie cookie) {
cookie.setHttpOnly(true);
cookie.setPath("/");
}
}

View File

@ -25,7 +25,6 @@
package cn.stylefeng.roses.kernel.auth.starter; package cn.stylefeng.roses.kernel.auth.starter;
import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi; import cn.stylefeng.roses.kernel.auth.api.SessionManagerApi;
import cn.stylefeng.roses.kernel.auth.api.cookie.SessionCookieCreator;
import cn.stylefeng.roses.kernel.auth.api.expander.AuthConfigExpander; import cn.stylefeng.roses.kernel.auth.api.expander.AuthConfigExpander;
import cn.stylefeng.roses.kernel.auth.api.password.PasswordStoredEncryptApi; import cn.stylefeng.roses.kernel.auth.api.password.PasswordStoredEncryptApi;
import cn.stylefeng.roses.kernel.auth.api.password.PasswordTransferEncryptApi; import cn.stylefeng.roses.kernel.auth.api.password.PasswordTransferEncryptApi;
@ -34,7 +33,6 @@ import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.auth.password.BcryptPasswordStoredEncrypt; import cn.stylefeng.roses.kernel.auth.password.BcryptPasswordStoredEncrypt;
import cn.stylefeng.roses.kernel.auth.password.RsaPasswordTransferEncrypt; import cn.stylefeng.roses.kernel.auth.password.RsaPasswordTransferEncrypt;
import cn.stylefeng.roses.kernel.auth.session.DefaultSessionManager; import cn.stylefeng.roses.kernel.auth.session.DefaultSessionManager;
import cn.stylefeng.roses.kernel.auth.session.cookie.DefaultSessionCookieCreator;
import cn.stylefeng.roses.kernel.auth.session.timer.ClearInvalidLoginUserCacheTimer; import cn.stylefeng.roses.kernel.auth.session.timer.ClearInvalidLoginUserCacheTimer;
import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
import cn.stylefeng.roses.kernel.jwt.JwtTokenOperator; import cn.stylefeng.roses.kernel.jwt.JwtTokenOperator;
@ -103,18 +101,6 @@ public class AuthAutoConfiguration {
return new RsaPasswordTransferEncrypt(pwdRsaSecretProperties.getPublicKey(), pwdRsaSecretProperties.getPrivateKey()); return new RsaPasswordTransferEncrypt(pwdRsaSecretProperties.getPublicKey(), pwdRsaSecretProperties.getPrivateKey());
} }
/**
* session cookie
*
* @author fengshuonan
* @since 2020/12/27 15:48
*/
@Bean
@ConditionalOnMissingBean(SessionCookieCreator.class)
public SessionCookieCreator sessionCookieCreator() {
return new DefaultSessionCookieCreator();
}
/** /**
* session便 * session便
* <p> * <p>
@ -127,7 +113,7 @@ public class AuthAutoConfiguration {
@ConditionalOnMissingBean(SessionManagerApi.class) @ConditionalOnMissingBean(SessionManagerApi.class)
public SessionManagerApi sessionManagerApi(CacheOperatorApi<LoginUser> loginUserCache, CacheOperatorApi<Set<String>> allPlaceLoginTokenCache) { public SessionManagerApi sessionManagerApi(CacheOperatorApi<LoginUser> loginUserCache, CacheOperatorApi<Set<String>> allPlaceLoginTokenCache) {
Long sessionExpiredSeconds = AuthConfigExpander.getSessionExpiredSeconds(); Long sessionExpiredSeconds = AuthConfigExpander.getSessionExpiredSeconds();
return new DefaultSessionManager(loginUserCache, allPlaceLoginTokenCache, sessionExpiredSeconds, sessionCookieCreator()); return new DefaultSessionManager(loginUserCache, allPlaceLoginTokenCache, sessionExpiredSeconds);
} }
/** /**

View File

@ -156,8 +156,7 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
@Override @Override
public LoginResponse login(LoginRequest loginRequest) { public LoginResponse login(LoginRequest loginRequest) {
// 不创建cookie默认开启记住我7天会话 // 默认开启记住我7天会话
loginRequest.setCreateCookie(false);
loginRequest.setRememberMe(true); loginRequest.setRememberMe(true);
// 验证拖拽验证码 // 验证拖拽验证码
@ -207,7 +206,7 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
synchronized (SESSION_OPERATE_LOCK) { synchronized (SESSION_OPERATE_LOCK) {
// 缓存用户信息,创建会话 // 缓存用户信息,创建会话
sessionManagerApi.createSession(jwtToken, loginUser, loginRequest.getCreateCookie()); sessionManagerApi.createSession(jwtToken, loginUser);
// 如果开启了单账号单端在线,则踢掉已经上线的该用户 // 如果开启了单账号单端在线,则踢掉已经上线的该用户
if (AuthConfigExpander.getSingleAccountLoginFlag()) { if (AuthConfigExpander.getSingleAccountLoginFlag()) {

View File

@ -47,7 +47,7 @@ import static cn.stylefeng.roses.kernel.rule.constants.RuleConstants.BASE64_IMG_
*/ */
@RestController @RestController
@ApiResource(name = "用户登录图形验证码", resBizType = ResBizTypeEnum.SYSTEM) @ApiResource(name = "用户登录图形验证码", resBizType = ResBizTypeEnum.SYSTEM)
public class KaptchaController { public class CaptchaController {
@Resource @Resource
private ImageCaptchaApi captchaApi; private ImageCaptchaApi captchaApi;
@ -72,7 +72,7 @@ public class KaptchaController {
* @author fengshuonan * @author fengshuonan
* @since 2021/7/5 12:00 * @since 2021/7/5 12:00
*/ */
@GetResource(name = "获取图形验证码", path = "/dragCaptcha", requiredPermission = false, requiredLogin = false) @GetResource(name = "获取拖拽验证码", path = "/dragCaptcha", requiredPermission = false, requiredLogin = false)
public ResponseData<DragCaptchaImageDTO> dragCaptcha() { public ResponseData<DragCaptchaImageDTO> dragCaptcha() {
DragCaptchaImageDTO captcha = dragCaptchaApi.createCaptcha(); DragCaptchaImageDTO captcha = dragCaptchaApi.createCaptcha();
captcha.setSrcImage(BASE64_IMG_PREFIX + captcha.getSrcImage()); captcha.setSrcImage(BASE64_IMG_PREFIX + captcha.getSrcImage());

View File

@ -78,27 +78,13 @@ public class LoginController {
private CacheOperatorApi<String> caClientTokenCacheApi; private CacheOperatorApi<String> caClientTokenCacheApi;
/** /**
* * API
* *
* @author fengshuonan * @author fengshuonan
* @since 2021/3/17 17:23 * @since 2021/3/17 17:23
*/ */
@PostResource(name = "登陆", path = "/login", requiredLogin = false, requiredPermission = false) @PostResource(name = "用户登陆API", path = "/loginApi", requiredLogin = false, requiredPermission = false)
public ResponseData<String> login(@RequestBody @Validated LoginRequest loginRequest) {
loginRequest.setCreateCookie(true);
LoginResponse loginResponse = authServiceApi.login(loginRequest);
return new SuccessResponseData<>(loginResponse.getToken());
}
/**
* (cookie)
*
* @author fengshuonan
* @since 2021/3/17 17:23
*/
@PostResource(name = "登陆(分离版)", path = "/loginApi", requiredLogin = false, requiredPermission = false)
public ResponseData<LoginResponse> loginApi(@RequestBody @Validated LoginRequest loginRequest) { public ResponseData<LoginResponse> loginApi(@RequestBody @Validated LoginRequest loginRequest) {
loginRequest.setCreateCookie(false);
LoginResponse loginResponse = authServiceApi.login(loginRequest); LoginResponse loginResponse = authServiceApi.login(loginRequest);
return new SuccessResponseData<>(loginResponse); return new SuccessResponseData<>(loginResponse);
} }

View File

@ -666,7 +666,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
loginUser.setWsUrl(WebSocketConfigExpander.getWebSocketWsUrl()); loginUser.setWsUrl(WebSocketConfigExpander.getWebSocketWsUrl());
// 缓存用户信息,创建会话 // 缓存用户信息,创建会话
sessionManagerApi.createSession(jwtToken, loginUser, false); sessionManagerApi.createSession(jwtToken, loginUser);
// 如果开启了单账号单端在线,则踢掉已经上线的该用户 // 如果开启了单账号单端在线,则踢掉已经上线的该用户
if (AuthConfigExpander.getSingleAccountLoginFlag()) { if (AuthConfigExpander.getSingleAccountLoginFlag()) {