当前位置: 首页 > 知识库问答 >
问题:

成功登录后获取文件下载而不是重定向到默认URL

叶福
2023-03-14

我正在尝试将Spring Security与数据库一起使用,在遵循一个示例之后,我可以登录(调用<code>onAuthenticationSuccess</code>),但我没有被重定向到默认页面,而是得到了一个空文件下载。我希望重定向到默认页面defaultSuccessUrl(“/”,true)

@GetMapping(path = "/")
public String displayInitialPage(Model model) {
    return "index";
}

安全配置类:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private WebApplicationContext applicationContext;

@Autowired
private UserService userDetailsService;

@Autowired
private DataSource dataSource;

@Autowired
private AuthenticationSuccessHandlerImpl successHandler;

@PostConstruct
public void completeSetup() {
    userDetailsService = applicationContext.getBean(UserService.class);
}

@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(encoder()).and()
            .authenticationProvider(authenticationProvider()).jdbcAuthentication().dataSource(dataSource);
}

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/register", "/style", "/script");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().anyRequest().authenticated().antMatchers("/login").permitAll().and().formLogin()
            .loginPage("/login").defaultSuccessUrl("/", true).permitAll().successHandler(successHandler).and().csrf().disable();
}

@Bean
public DaoAuthenticationProvider authenticationProvider() {
    final DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
    authProvider.setUserDetailsService(userDetailsService);
    authProvider.setPasswordEncoder(encoder());
    return authProvider;
}

@Bean
public PasswordEncoder encoder() {
    return new BCryptPasswordEncoder(11);
}

/**
 * Enables activation of automatic resolving of spring-data specific expressions annotated on classes
 * @return SecurityEvaluationContextExtension
 */
@Bean
public SecurityEvaluationContextExtension securityEvaluationContextExtension() {
    return new SecurityEvaluationContextExtension();
}

共有2个答案

南门魁
2023-03-14

我更改了安全配置类,如下所示:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private UserService userDetailsService;

@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(encoder());
}

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/register", "/style", "/script");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().anyRequest().authenticated().antMatchers("/login").permitAll().and().formLogin()
            .loginPage("/login").defaultSuccessUrl("/", true).permitAll();
}

@Bean
public PasswordEncoder encoder() {
    return new BCryptPasswordEncoder(11);
}
}
王楚青
2023-03-14

这意味着浏览器无法识别响应,假设它是一个文件(最后的手段)

您有此控制器:

@GetMapping(path = "/")
public String displayInitialPage(Model model) {
    return "index";
}

因此,Spring将获取值"index"并尝试将其映射到某些内容。这里的幕后发生了很多魔法。

假设您正在使用Spring Boot并且您有一个gradle构建,您的依赖项:

    compile group: "org.springframework.security", name: "spring-security-core", version: "$springSecurityVersion"
    compile group: "org.springframework.security", name: "spring-security-web", version: "$springSecurityVersion"
    compile group: "org.springframework.boot", name: "spring-boot-starter-web", version: "$springBootVersion"
    compile group: "org.springframework.boot", name: "spring-boot-starter-security", version: "$springBootVersion"
    compile group: "org.springframework.boot", name: "spring-boot-starter-thymeleaf", version: "$springBootVersion"
    compile group: "org.thymeleaf.extras", name: "thymeleaf-extras-springsecurity5", version: "$thymeleafExtrasSpringSecurityVersion"

注意最后两行。这些使thymeleaf成为模板引擎。Spring将在目录中查找

./src/main/resources/templates

对于一个名为index.html的文件

该文件可能如下所示:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head>
    <title>Spring Security - Simple Flow for Spring Boot Authentication</title>
    <meta charset="utf-8" />
</head>
<body>
<div style="float: right" th:fragment="logout" sec:authorize="isAuthenticated()">
    <div style="float:left">
        <span style="font-weight:bold">User: </span><span sec:authentication="name"></span>
    </div>
    <div style="float:none">&nbsp;</div>
    <div style="float:right">
        <form action="#" th:action="@{/local/logout}" method="post">
            <input type="submit" value="Local Logout" />
        </form>
    </div>
</div>
<h1>Success</h1>
</body>
</html>

在Spring Web MVC中,有一个名为bean的 bean

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/templates/");
        viewResolver.setSuffix(".html");
        ....
        return viewResolver;
    }

Spring Boot有一个名为自动配置的组件。因此,它会查找存在的库并相应地配置解析器。有用于遗留应用程序的JSP解析器,当您想将JSON、XML或其他格式发送回来时,有内容映射解析器,还有我首选的thymeleaf,用于发送回超文本标记语言内容。

在任何给定时间,您都可以配置多个解析器。

我的社区回购有很多例子可以玩。

https://github.com/fhanik/spring-security-community/tree/master/samples

 类似资料:
  • 我们的团队正在使用Spring boot(2.2.2)开发一个web应用程序。它使用Spring security来处理登录过程。我们希望应用程序在登录前重定向回页面(例如,用户访问)http://example.com/foo/bar - 除了应用程序偶尔指向默认页面(例如,http://example.com)而不是登录前的页面。发生这种情况时,登录前的页面似乎没有保存在会话中(根据我的队友的

  • 我正在尝试使用MVC客户端设置IdentityServer4。 一切正常,直到我想添加ASP身份。当我添加代码以使用SQL server和Identity时,成功登录后,Identity server不会将我重定向回客户端,但它只是“刷新”页面。 IdentityServer应用程序启动: 在IdentityServer中配置 在MVC客户端中启动: 来自IdentityServer的日志: 我只

  • 问题内容: 我知道之前曾有人问过这个问题,但是我在这里面临一个特殊的问题。 我使用Spring Security 3.1.3。 我的Web应用程序中有3种可能的登录案例: 通过登录页面登录:确定。 通过受限页面登录:也可以。 通过非受限页面登录:不好,…每个人都可以访问“产品”页面,并且用户可以在登录后发表评论。因此,同一页面中包含一个登录表单,以允许用户进行连接。 情况3)的问题是我无法设法将用

  • 我知道这个问题以前有人问过,但我现在面临一个特殊的问题。 我使用spring security 3.1.3。 我的web应用程序中有3种可能的登录情况: 通过登录页登录:确定。 通过受限页面登录:也可以。 通过非受限页面登录:不确定...每个人都可以访问“产品”页面,如果用户已经登录,他可以发表评论。因此登录表单包含在同一页面中,以便允许用户进行连接。 案例3)的问题是,我无法将用户重定向到“产品

  • MvcConfig方法如下所示:

  • 我正在使用Spring Security和前端reactJS的Spring Boot构建一个应用程序。我的代码可以很好地进行身份验证。但现在我计划将用户重定向到他以前请求的页面,以防他再次登录。 我可以从成功处理程序中提取 targetUrl,即上一页,但是当我在 UI 上执行控制台.log(数据)时。我得到的是原始的html数据而不是URL名称。我不知道为什么以及如何打开这样的原始 html 代