gpt4 book ai didi

java - 登录后需要 Spring Security 和 Action

转载 作者:搜寻专家 更新时间:2023-10-30 21:32:41 24 4
gpt4 key购买 nike

我正在尝试在用户登录 Spring Security 后实现一个需要操作的屏幕?我有一个要求,用户必须执行以完成表单(更改密码、接受使用条款等),然后一旦用户完成该操作,他就可以使用应用程序的其余部分。我将 Spring OAuth2 与使用 Spring Security 流程的登录屏幕一起使用。

到目前为止,我已经尝试使用具有 SavedRequestAwareAuthenticationSuccessHandler 自定义实现的 http.formLogin().successHandler(),它检测用户是否需要执行操作,然后重定向用户在可以填写表单时访问该页面,但问题在于,如果用户离开该页面,他将登录到该应用程序并可以在不跳过表单的情况下使用它。但我想做的是阻止用户建立 session ,直到完成“需要操作”的表单。一旦完成,用户应该会自动登录(例如,如果用户被要求只同意使用条款,他应该在没有第二次输入密码的情况下登录)

这是我到目前为止自定义处理程序的代码:

public class CustomLoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {

@Autowired
UserService userService;

public final static String TARGET_URL_SESSION_ATTR_NAME = "target-url";

public CustomLoginSuccessHandler(String defaultTargetUrl) {
setDefaultTargetUrl(defaultTargetUrl);
}

@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
HttpSession session = request.getSession();


AuthorityUser authorityUser = (AuthorityUser)authentication.getPrincipal();

String userId = authorityUser.getUserId();

User u = userService.getById(userId);

Boolean changeRequiredDob = u.getChangeRequiredDob();
Boolean changeRequiredPwd = u.getChangeRequiredPwd();
Boolean changeRequiredTou = u.getChangeRequiredTou();

if(changeRequiredDob || changeRequiredPwd || changeRequiredTou){

String targetUrl = determineTargetUrl(request, response);
session.setAttribute(TARGET_URL_SESSION_ATTR_NAME, targetUrl);
getRedirectStrategy().sendRedirect(request, response, "/action-required");
} else {
super.onAuthenticationSuccess(request, response, authentication);
}
}
}

一旦成功完成,我会将用户重定向到存储到 session 中的 TARGET_URL_SESSION_ATTR_NAME

了解如何在已建立的 session 期间检测并将用户重定向到需要操作的屏幕(如果用户登录并且稍后在他登录时管理员在他的帐户上设置了需要操作的标志)也会很有帮助。

最佳答案

https://github.com/king-julien/spring-oauth2-customfilter这是授权和资源服务器的工作示例。此资源服务器(vanilla)是一个基本的无状态应用程序,在您接受服务条款(接受 TOS,只需在/tos 端点上执行 POST)之前,它不会继续进行任何进一步的验证。

创建过滤器

@Component
public class TosFilter extends OncePerRequestFilter{

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
System.out.println(request.getRequestURI());

// In realworld scenario HelloWorldController.acceptedTOS is a persisted value rather than a static variable
if(!HelloWorldController.acceptedTOS){
//response.sendRedirect("/no-tos");
request.getRequestDispatcher("error-no-tos").forward(request, response);
}
filterChain.doFilter(request,response);
}
}

注册那个过滤器

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
TosFilter rolesFilter;

@Override
public void configure(HttpSecurity httpSecurity) throws Exception{

httpSecurity
.addFilterAfter(rolesFilter, AbstractPreAuthenticatedProcessingFilter.class)
.csrf().disable()
.authorizeRequests().anyRequest().permitAll();
}
}

用@EnableResourceServer 注释你的 main。

@SpringBootApplication
@EnableResourceServer
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

}

关于java - 登录后需要 Spring Security 和 Action,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40541838/

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