【问题标题】:spring rbac authentication by database通过数据库进行spring rbac身份验证
【发布时间】:2020-10-01 09:37:48
【问题描述】:

我正在尝试在 Spring Boot 中创建基于角色的授权,我对 Spring 完全陌生,我主要使用 PHP。

找到这个链接:

https://spring.io/guides/gs/securing-web/

一切都很好但与数据库没有连接,还试图了解如何创建与数据库的授权


public class UserDetailsServiceImp implements UserDetailsService {
    
    private UserRepository userRepository;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    /*Here we are using dummy data, you need to load user data from
     database or other third party application*/
        User user = findUserbyUername(username);

        UserBuilder builder = null;
        if (user != null) {
            builder = org.springframework.security.core.userdetails.User.withUsername(username);
            builder.password(//new BCryptPasswordEncoder().encode(user.getName())
                    user.getName() );
            builder.roles("USER");
        } else {
            throw new UsernameNotFoundException("User not found.");
        }

        return builder.build();
    }

    private User findUserbyUername(String username) {

        return userRepository.findByName(username);
    }
}


@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/", "/home", "/demo/all", "/demo/add", "/demo/findby").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .permitAll();
    }

    /*@Bean
    @Override
    public UserDetailsService userDetailsService() {
        UserDetails user =
                User.withDefaultPasswordEncoder()
                        .username("user")
                        .password("password")
                        .roles("USER")
                        .build();

        return new InMemoryUserDetailsManager(user);
    }*/

    @Bean
    public UserDetailsService userDetailsService() {
        return new UserDetailsServiceImp();
    };

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    };

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

用户存储库

public interface UserRepository extends CrudRepository<User, Integer> {

    User findByName(String name);

}

用户

@Entity // This tells Hibernate to make a table out of this class
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    private String name;

    private String email;

    private String[] roles;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

浏览器收到“无效的用户名和密码”。

这里可能有什么问题,我唯一可以通过名称从数据库中找到用户并进行比较

请帮忙!懂春天的人

【问题讨论】:

  • 有没有具体的错误,在这里加上错误日志会有帮助。
  • @Atul 添加了错误日志
  • 我猜它无法找到存储库,因为存在空指针异常。
  • 也添加您的用户存储库代码
  • @Atul 添加了 userreposiroty 它也是取自 mysql spring 教程,用户类显示用户表中的数据,我想我可以很容易地找到并返回用户数据来授权而不是静态数据

标签: spring-boot


【解决方案1】:

在你的 UserDetailsS​​erviceImp 类中试试这个:

@Autowired
private UserRepository userRepository;

【讨论】:

  • 非常感谢,了解了Autowired和组件,不知道这个注解初始化私有UserRepository userRepository;
  • 顺便说一下@Autowired是Spring中使用最多的注解...
猜你喜欢
  • 2012-06-05
  • 2012-03-06
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 2013-06-12
相关资源
最近更新 更多