Spring Boot 安全登录验证失败

Posted

技术标签:

【中文标题】Spring Boot 安全登录验证失败【英文标题】:Spring boot security login verify failed 【发布时间】:2018-12-10 05:42:33 【问题描述】:

我想在用户发送localhost:8080/submit请求时验证用户的身份,所以我在SecurityConfig类中添加了以下内容:

@Override
protected void configure(HttpSecurity http) throws Exception 
    http
            .authorizeRequests()
            .antMatchers("/submit").access("hasRole('WORKER')")
            .antMatchers("/**").permitAll()
            .and()
            .formLogin()
            .loginPage("/login")
            .and()
            .logout()
            .logoutSuccessUrl("/")
            .and()
            .rememberMe()
            .tokenValiditySeconds(4838400)
            .key("workerKey");

我希望当我在地址字段中输入localhost:8080/submit 时页面可以重定向到localhost:8080/login。我的 Worker 实体的角色为“WORKER”:

@Override
public Collection<? extends GrantedAuthority> getAuthorities() 
    return Arrays.asList(new SimpleGrantedAuthority("WORKER"));

当我输入“localhost:8080/submit”时,我可以注册一个帐户并重定向到登录页面。但是当我输入正确的用户名和密码时,它会响应我一个错误页面而不是提交页面:

出现意外错误(类型=禁止,状态=403)。 禁止

我的提交页面只是一个“欢迎”字词页面。我的映射是

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String showLogin() 
    return "login";


@RequestMapping(value = "/submit", method = RequestMethod.GET)
public String showSubmit() 
    return "submit";

而且当我再次输入localhost:8080/submit时,这次并没有重定向到登录页面。相反,它直接重定向到错误页面并显示相同的错误。那么是什么禁止我重定向到提交页面呢?

【问题讨论】:

我不知道你的情况到底有什么问题。但是,如果您想要一个可行的解决方案,当用户点击/submit 时应该进行身份验证,我可以提供一个。 @Dfor 那也很棒!我如何获得它? 【参考方案1】:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter 


    @Override
    protected void configure(HttpSecurity http) throws Exception 

        http.authorizeRequests().anyRequest().fullyAuthenticated()

                .antMatchers("/submit").hasRole("WORKER").and().formLogin().permitAll().and().logout().permitAll();

    

    @Bean
    public UserDetailsService userDetailsService() 
        // ensure the passwords are encoded properly
        @SuppressWarnings("deprecation")
        UserBuilder users = User.withDefaultPasswordEncoder();
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(users.username("me").password("me").roles("WORKER").build());
        return manager;
    


您可以使用自定义 login page 进行更多自定义。

【讨论】:

感谢您为我提供替代解决方案。我还为我的代码找到了解决方案。有兴趣的可以看我的回答! 使您的答案有效 “使您的答案有效”是什么意思?我无法理解。 勾选你的答案的有效按钮,让新人知道你的问题的解决方案。 是的,就是这样。我明白了。【参考方案2】:

我自己发现了问题。我需要将 Worker 类中的角色“WORKER”更改为“ROLE_WORKER”。像这样

@Override
public Collection<? extends GrantedAuthority> getAuthorities() 
    return Arrays.asList(new SimpleGrantedAuthority("ROLE_WORKER"));

看来我无法在 Worker 类中将角色“ROLE_WORKER”简化为“WORKER”,但可以在 SecurityConfig 类中简化它。

【讨论】:

查看此 url 以删除 spring 安全角色中的前缀 ***.com/questions/38134121/…

以上是关于Spring Boot 安全登录验证失败的主要内容,如果未能解决你的问题,请参考以下文章

REST api 的 Spring 安全性在身份验证失败时显示浏览器弹出窗口

使用摘要过滤器的 Spring-boot 摘要身份验证失败

JPQL 的 Spring Boot JPA“查询验证失败”错误

Spring boot Ldap 身份验证失败,LDAP 错误代码 49 - 80090308 数据 52e

Spring Boot 从 1.5.3 升级到 1.5.4,自定义验证配置启动失败

当 Spring Boot 中使用 Hibernate Validator 的 Bean 验证失败时,如何抛出自定义异常?