美文网首页Java 杂谈java 知识点
Spring Security 简单配置用户存储

Spring Security 简单配置用户存储

作者: Tim在路上 | 来源:发表于2019-01-21 16:15 被阅读11次

    spring Security从两个角度解决安全问题:

    • 使用servlet中的filter来保护web请求,并限制url级别的访问。
    • 使用Aop的方法,借助于对象代理和使用通知,来限制用户访问。

    Spring Security可以使用java进行简单的配置

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter{}
    

    @EnableWebSecurity注解将会启动Web安全功能,但它本身并没有什么功能。Spring Security必须配置在一个实现了WebSecurityConfigurer的bean中,或者扩展WebSecurityConfigurerAdapter,扩展该类是最简单的配置方法。

    我们可以通过重载WebSecurityConfigurerAdapter中的一个或多个方法来指定Web安全的细节。

    WebSecurityConfigurerAdapter的三个configure()方法:configure(WebSecurity)、configure(HttpSecurity)、configure(AuthenticationManagerBuilder)

    三个实现类分别作用为:configure(AuthenticationManagerBuilder)配置user-detail服务,configure(WebSecurity)配置Spring Security的filter链,configure(HttpSecurity)配置如何通过拦截器保护请求。

    每一个用户都应该具有自己信息存储的地方,这样可以方便的进行认证,个性化定制等等。

    Spring Security可以实现内存、关系型数据库以及LDAP用户存储的定制。

    基于内存的用户存储

    继承WebSecurityConfigurerAdapter需要重写的第一个方法就是关于用户细节的。

    通过inmMemoryAuthentication()方法,我们可以启用、配置并任意填充基于内存的用户存储。

    @Configuration
    @EnableWebMvcSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter{
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception{
            auth.inMemoryAuthentication().withUser("user").password("password").roles("USER").and().withUser("admin").password("password").roles("USER","ADMIN");
        }
    }
    

    withUser()方法返回的是UserDetailsManagerConfigurer.UserDetailsBuilder,这个对象提供了多个进一步配置用户的方法,如上面的为用户设置密码的password()方法、授予用户多个角色权限的roles()方法。

    常见的方法有,accountLocked(boolean)判断用户是否锁定,authorites()授予某一个用户一项或多项权限。soles()授予某个用户一项或多项权限

    基于数据库表的认证

    protected void configure(Authentication auth) throws Exception{
        auth
          .jdbcAuthentication()
             .dataSource(dataSource)
                .usersByUsernameQuery("select username,password,true from Spitter where username=?")
                .authoritiesByUsernameQuery("select username,'ROLE_USER' from Spitter where username=?");
    }
    

    我们使用JDBCAuthentication()方法来实现一JDBC为支撑的用户存储,必须要配置的只是一个DataSource,就能访问关系型数据库了

    passwordEncoder()方法可以接受Spring Security中PasswordEncoder接口的任意实现。Spring Security的加密模块包括三个这样的实现:BCryptPasswordEncoder、NoOpPasswordEncoder和StandardPasswordEncoder。

    基于LDAP认证

    protected void configure(Authentication auth) throws Exception{
        auth
          .ldapAuthentication()
             .userSearchFilter("(uid={0})")
             .groupSearchFilter("member={0}");
    }
    

    配置自定义的用户服务

    如果我们需要认证的用户存储在非关系型数据库中,如Mongo或Neo4j,那么我们需要提供一个自定义的UserDetailsService接口实现。UserDetailsService接口非常简单:

    public interface UserDetailsService{
        UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
    }
    

    我们需要做的就是实现loadUserByUsername()方法,根据给定的用户名来查找用户。该方法会返回代表给定用户的UserDetails对象。

    @Autowired
    SpitterRepository spitterRepository;
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception{
       auth.userDetailsService(new SpitterUserSevice(spitterRepository));
    }
    

    相关文章

      网友评论

        本文标题:Spring Security 简单配置用户存储

        本文链接:https://www.haomeiwen.com/subject/cbwcjqtx.html