Spring Security学习

 

1.  Spring Security有哪几种常见的认证方式? 

     答: 

1) 基于内存的方式。 

2) 基于数据库的方式。此种方式为常用的方式,适用于生产环境。 

3) 基于LDAP的方式。

      LDAP有配置远程服务器和配置嵌入是的LDAP服务器2种方式,

           远程的LDAP服务器需要配置contextSource方法来配置远程服务器的地址url。 .contextSource().url("ldap://habuma.com:389/dc=habuma,dc=com")

           嵌入的LDAP服务器需要通过root方法来配置。  .contextSource().root("dc=habuma,dc=com")

       

2.怎么配置自定义的用户服务?

      答: 我们只需要实现Spring Security提供的UserDetailsService接口就行了。通过实现该接口里的loadUserByUserName来自定义查找用户等操作。另外可以通过SpitterRepository来创建user对象,其中原理是获取到spitter对象,然后用它来创建user对象。我们不需要了解其框架的实现原理,只需要获取到user对象即可。

 

 

3.  怎么开启SpringSecurity安全机制?  怎么编写自定义的简单安全配置?  

      答: 通过使用@EnableWebSecurity注解开启web安全机制,如果是mvc应用,那么需要使用@EnableWebMvcSecurity注解来开启web安全机制;  如果想要编写自定义的安全配置文件,那么需要继承Spring Security的WebSecurityConfigurerAdapter类,然后重写configure方法,这样就能实现自定义的安全配置了。

 

4. 怎么给通过Spring Security给密码加密?

     答:   通过.passwordEncoder(new StandardPasswordEncoder("53crt3t"))方法给用户的密码进行转码加密。

             还有其他的加密实现类,加密策略为: 

             BCrptPasswordEncoder,  NoOpPasswordEncoder。

            另外也可以通过自定义的接口来实现转码:
            public interface PasswordEncoder{

                String encode(CharSequence rawPassWord);

                Boolean matches(CharSequence rawPassWord,String encodedPassword);

           }

          需要注意的是:  生产中,数据库的密码是永远不会解码的,用户输入的密码会通过相同的算法来比较数据库里的密码,即转码后才作比较。

 

 

5.  怎么防止跨域的crsf攻击?

      答:  使用.and().crsf().enable();方法来开启crsf防护。 

          @Override

          protected void configure(HttpSecurity http) throws Exception{

           http

          .... 

            .and()

            .crsf()

            .enable()      

         }

         .and().crsf().disable();

 

 

6.  Spring Security里面自带的角色权限是怎么样的?是怎么配置的?

    答: 使用 AuthenticationManagerBuilder 类来得到 .roles()方法来指定用户的角色,一般用户是USER,管理员是ADMIN。 通过指定用户角色来限定访问,没有角色的用户是不能访问系统的。

     auth

    .inMemoryAuthentication()

    .withUser("user").password("password").roles("USER").and()

    .withUser("admin").password("password").roles("USER","ADMIN");

    .withUser()方法为内存用户存储添加新的用户,参数为username,通过.and()方法可以将多个用户的配置连接在一起。

 

7.  怎么定义保护路径的配置方法?

            @Overrider

         protected void configure(HttpSecurity Http) throws Exception{

        http.

         authorizeRequests()

         .antMatchers("/spitters/me").authenticated()

         .antMatchers(HttpMethod.POST,"/spittles").authenticated()

         .anyRequest().permitAll();

           }

          其中 antMatchers()方法能够同时指定多个路径来进行保护,同时也可以使用通配符类指定路径 "/spitters/**",  也可以使用regexMatchers()方法能够接受正则表达式的方式来保护请求。

           如下是常用的保护路径的配置方法:

              Spring Security学习