【问题标题】:Implement Custom Spring Security Authentication Method实现自定义 Spring Security 身份验证方法
【发布时间】:2014-12-04 19:23:34
【问题描述】:

我正在构建一个带有用户登录机制的 Spring MVC Web 应用程序。我已经使用 spring-boot 来设置我的应用程序。要使用数据库对用户进行身份验证,我遵循以下教程:

http://justinrodenbostel.com/2014/05/30/part-5-integrating-spring-security-with-spring-boot-web/

这里使用了spring的内置认证程序。通过指定

auth.jdbcAuthentication().dataSource(datasource);

Spring 安全检查用户和权限表并验证用户。

我想覆盖此默认行为,因为我没有(不需要)身份验证表。另外,我的用户表的列比标准的三列多得多,即用户名、密码和启用。

如何覆盖默认实现?

另外,用户登录后,如何获取用户信息?

谢谢!

【问题讨论】:

  • 这个例子很多,搜索UserDetailsS​​ervice。
  • 查看此页面,它可能会帮助您了解需要做什么,因为上面有一个不错的示例igorristic.blogspot.com.au/2014/09/…

标签: java spring spring-mvc spring-security spring-boot


【解决方案1】:

您可以创建自定义 AuthenticationProvider 或将 DaoAuthenticationProvider 与自定义 UserDetailsService 实现结合使用。

这里是第二种解决方案的 Spring Java 配置类示例:

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserService userService;

    // ...

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider());
    }

    @Bean
    public AuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
        authenticationProvider.setPasswordEncoder(new ShaPasswordEncoder());
        authenticationProvider.setUserDetailsService(userService);
        return authenticationProvider;
    }

}

UserDetailsService 接口的实现将包含特定于项目域的逻辑,用于通过用户名检索用户。

如果您需要更详细的示例,请在下面发表评论,我会更新答案,但这应该会给您大致的想法。

另外我建议通读上述 Spring 类和接口的 JavaDocs。

【讨论】:

  • 好答案;唯一的批评是不推荐 MD5 和 SHA 作为散列函数,而是使用 Blowfish 散列(bCryptPasswordEncoder),因为它可以适应计算能力变得更便宜(因此破解密码变得更容易)。详情:codahale.com/how-to-safely-store-a-password
猜你喜欢
  • 2016-07-24
  • 2014-04-20
  • 2014-12-13
  • 2016-08-05
  • 2020-12-05
  • 2015-04-27
  • 2013-08-15
  • 2014-01-12
  • 2016-09-05
相关资源
最近更新 更多