猿问

Springboot 安全配置未重定向到 successUrl

我似乎不明白我的代码有什么问题。我正在尝试使用 Springboot 安全登录,一切似乎都正确,我可以在控制台上看到我的用户名和密码。谁能告诉我我出了什么问题?


这是我的 SecSecurityConfig 类


     package com.scanapp.config;

     import com.scanapp.repositories.RoleRepository;

     import com.scanapp.services.UserDetailsService;

     import org.springframework.beans.factory.annotation.Autowired;

     import org.springframework.beans.factory.annotation.Qualifier;

     import org.springframework.context.annotation.Bean;

     import org.springframework.context.annotation.Configuration;

     import 

     org.springframework.security.authentication.dao.DaoAuthenticationProvider;

     import org.springframework.security.crypto.password.PasswordEncoder;


     @Configuration

     @EnableWebSecurity

     public class SecSecurityConfig extends WebSecurityConfigurerAdapter {



     @Autowired

     private RoleRepository roleRepository;





    @Autowired

    @Qualifier("myuserdet")

    UserDetailsService userDetailsService;

    protected void init(AuthenticationManagerBuilder auth) throws Exception {

        System.out.println("I'm here");

        auth.authenticationProvider(authProvider());

    }


    @Bean

    public DaoAuthenticationProvider authProvider() {

        System.out.println("got here");

        DaoAuthenticationProvider authProvider = new 

       DaoAuthenticationProvider();

        authProvider.setUserDetailsService(userDetailsService);

        authProvider.setPasswordEncoder(passwordEncoder());

        return authProvider;

    }



    @Bean

    public PasswordEncoder passwordEncoder()

      {


        return new CustomPassword();

       }


尚方宝剑之说
浏览 135回答 3
3回答

catspeake

尝试从配置中删除此块。理论上,Spring 在幕后创建了所有这些 bean(自动获取您的 passwordEncoder 和 UserDetailsService)。@Autowired@Qualifier("myuserdet")UserDetailsService userDetailsService;protected void init(AuthenticationManagerBuilder auth) throws Exception {    System.out.println("I'm here");    auth.authenticationProvider(authProvider());}@Beanpublic DaoAuthenticationProvider authProvider() {    System.out.println("got here");    DaoAuthenticationProvider authProvider = new    DaoAuthenticationProvider();    authProvider.setUserDetailsService(userDetailsService);    authProvider.setPasswordEncoder(passwordEncoder());    return authProvider;}如果它不起作用,请尝试重命名您的 UserDetailsService(尽管这是一个远景)。

呼如林

你的代码中有很多噪音。1.您定义了自定义密码,它只是扩展了 BCryptPasswordEncoder。我建议返回@Beanpublic PasswordEncoder passwordEncoder(){    return new BCryptPasswordEncoder();}2. 您定义了另一个 User 模型,该模型什么也不做,并且授予权限的列表为空。这很奇怪,因为如果权限列表为空,它应该会失败。请退回进口org.springframework.security.core.userdetails.User;//..return new User(userName, encodedPassword, Collections.singletonList(new SimpleGrantedAuthority("USER")3.最好为你的豆子使用另一个名字,而不是春天的名字。请将 UserDetailsService 重命名为 CustomUserDetailsService 并且不要在您的配置中使用限定符。4.请确保当您将密码保存在数据库中时,它们会使用 BCryptPasswordEncoder 进行哈希处理。

隔江千里

好的。另一个想法:根据文档,此方法不应返回 null:@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {&nbsp; &nbsp; &nbsp; &nbsp; return null;}AuthorityUtils.NO_AUTHORITIES;而是返回。理论上,它可以NullpointerException在您的 UserDetailsService 创建主体后的身份验证期间引发。如果那里有一个将军catch (Exception e),那么它将被简单地嵌入到AuthenticationException.- - 编辑哎哟!您还应该将返回值更改为类true中的最后四个方法MyUserPrincipal:@Overridepublic boolean isAccountNonExpired() {&nbsp; &nbsp; return true;}@Overridepublic boolean isAccountNonLocked() {&nbsp; &nbsp; return true;}@Overridepublic boolean isCredentialsNonExpired() {&nbsp; &nbsp; return true;}@Overridepublic boolean isEnabled() {&nbsp; &nbsp; return true;}你的校长总是被禁用和过期等等。当然是不允许登录的!:)
随时随地看视频慕课网APP

相关分类

Java
我要回答