gpt4 book ai didi

java - 用户登录后访问登录页面,如何重定向到首页?

转载 作者:太空狗 更新时间:2023-10-29 22:34:42 25 4
gpt4 key购买 nike

这是我的 spring 安全配置:

<http pattern="/auth/login" security="none" />
<http pattern="/auth/loginFailed" security="none" />
<http pattern="/resources/**" security="none" />

<http auto-config="true" access-decision-manager-ref="accessDecisionManager">
<intercept-url pattern="/auth/logout" access="permitAll"/>
<intercept-url pattern="/admin/**" access="ADMINISTRATIVE_ACCESS"/>
<intercept-url pattern="/**" access="XYZ_ACCESS"/>

<form-login
login-page="/auth/login"
authentication-failure-url="/auth/loginFailed"
authentication-success-handler-ref="authenticationSuccessHandler" />
<logout logout-url="/auth/logout" logout-success-url="/auth/login" />
</http>

authenticationSuccessHandler 扩展了 SavedRequestAwareAuthenticationSuccessHandler,确保用户被重定向到他最初请求的页面。

但是,由于 /auth/login 被标记为 security="none",如果用户访问登录页面,我无法成功将用户重定向到主页登录后。我相信这是正确的user experience也是。

我也尝试了下面的方法,但是 Principal 对象总是 null,大概是因为 security="none" 属性。

@RequestMapping(value = "/auth/login", method = GET)
public String showLoginForm(HttpServletRequest request, Principal principal) {
if(principal != null) {
return "redirect:/";
}

return "login";
}

最佳答案

我比上次更深入地检查了主题,发现您必须确定用户是否由您自己在 Controller 中进行了身份验证。行绞车(Spring Security 开发人员)says here :

Spring Security is not aware of the internals of your application (i.e. if you want to make your login page flex based upon if the user is logged in or not). To show your home page when the login page is requested and the user is logged in use the SecurityContextHolder in the login page (or its controller) and redirect or forward the user to the home page.

所以解决方案是确定用户是否请求 /auth/login是否匿名,如下所示。

applicationContext-security.xml:

<http auto-config="true" use-expressions="true"
access-decision-manager-ref="accessDecisionManager">
<intercept-url pattern="/auth/login" access="permitAll" />
<intercept-url pattern="/auth/logout" access="permitAll" />
<intercept-url pattern="/admin/**" access="ADMINISTRATIVE_ACCESS" />
<intercept-url pattern="/**" access="XYZ_ACCESS" />

<form-login login-page="/auth/login"
authentication-failure-url="/auth/loginFailed"
authentication-success-handler-ref="authenticationSuccessHandler" />
<logout logout-url="/auth/logout" logout-success-url="/auth/login" />
</http>

<beans:bean id="defaultTargetUrl" class="java.lang.String">
<beans:constructor-arg value="/content" />
</beans:bean>

<beans:bean id="authenticationTrustResolver"
class="org.springframework.security.authentication.AuthenticationTrustResolverImpl" />

<beans:bean id="authenticationSuccessHandler"
class="com.example.spring.security.MyAuthenticationSuccessHandler">
<beans:property name="defaultTargetUrl" ref="defaultTargetUrl" />
</beans:bean>

添加到 applicationContext.xml bean 定义:

<bean id="securityContextAccessor"
class="com.example.spring.security.SecurityContextAccessorImpl" />

这是类

public final class SecurityContextAccessorImpl
implements SecurityContextAccessor {

@Autowired
private AuthenticationTrustResolver authenticationTrustResolver;

@Override
public boolean isCurrentAuthenticationAnonymous() {
final Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
return authenticationTrustResolver.isAnonymous(authentication);
}
}

实现简单的接口(interface)

public interface SecurityContextAccessor {
boolean isCurrentAuthenticationAnonymous();
}

( SecurityContextHolder accessing code is decoupled from controller, I followed suggestion from this answer ,因此是 SecurityContextAccessor 界面。)

最后但并非最不重要的是 Controller 中的重定向逻辑:

@Controller
@RequestMapping("/auth")
public class AuthController {
@Autowired
SecurityContextAccessor securityContextAccessor;

@Autowired
@Qualifier("defaultTargetUrl")
private String defaultTargetUrl;

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login() {
if (securityContextAccessor.isCurrentAuthenticationAnonymous()) {
return "login";
} else {
return "redirect:" + defaultTargetUrl;
}
}
}

定义 defaultTargetUrl String bean 看起来像 hack,但我没有更好的方法来不对 url 进行硬编码...(实际上在我们的项目中,我们使用 <util:constant> 和包含静态最终字符串字段的类。)但它毕竟有效。

关于java - 用户登录后访问登录页面,如何重定向到首页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12597519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com