栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Spring Security:如何在登录URL中添加重定向查询参数以允许对该页面添加书签?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Security:如何在登录URL中添加重定向查询参数以允许对该页面添加书签?

警告 :使用参数来确定要重定向到的位置可以将应用程序打开到“
打开重定向漏洞”为止。基于用户输入执行重定向时要非常小心。

ContinueEntryPoint

您的第一步是创建一个

AuthenticationEntryPoint
,负责在显示登录表单时在URL中包含一个参数以继续在URL中。在这个例子中,我们将使用参数名称continue。

import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.security.core.AuthenticationException;import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;import org.springframework.security.web.util.UrlUtils;import org.springframework.web.util.UriComponentsBuilder;public class ContinueEntryPoint extends LoginUrlAuthenticationEntryPoint {    public ContinueEntryPoint(String loginFormUrl) {        super(loginFormUrl);    }    @Override    protected String determineUrlToUseForThisRequest(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) {        String continueParamValue = UrlUtils.buildRequestUrl(request);        String redirect = super.determineUrlToUseForThisRequest(request, response, exception);        return UriComponentsBuilder.fromPath(redirect).queryParam("continue", continueParamValue).toUriString();    }}

Web安全配置

下一步将包括使用ContinueEntryPoint的安全性配置。例如:

import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {    @Override    protected void configure(HttpSecurity http) throws Exception {        http .exceptionHandling()     .authenticationEntryPoint(new ContinueEntryPoint("/login"))     .and() .authorizeRequests()     .antMatchers("/login").permitAll()     .anyRequest().authenticated()     .and() .formLogin();    }}

LoginController

最后,如果用户已经通过身份验证,则应该创建一个LoginController重定向到该参数。例如:

import javax.validation.constraints.Pattern;import org.hibernate.validator.constraints.NotBlank;public class RedirectModel {    @Pattern(regexp="^/([^/].*)?$")    @NotBlank    private String continueUrl;    public void setContinue(String continueUrl) {        this.continueUrl = continueUrl;    }    public String getContinue() {        return continueUrl;    }}@Controllerpublic class LoginController {    @RequestMapping("/login")    public String login(Principal principal, @Valid @ModelAttribute RedirectModel model, BindingResult result) {        if (!result.hasErrors() && principal != null) { // do not redirect for absolute URLs (i.e. https://evil.com) // do not redirect if we are not authenticated return "redirect:" + model.getContinue();        }        return "login";    }}

完整样本

您可以在sow.34087954-continue-on-login分支的rwinch / spring-security-
sample中的github中找到完整的示例。如果您不想使用git,则可以轻松下载它。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/596031.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号