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()方法能够接受正则表达式的方式来保护请求。
如下是常用的保护路径的配置方法: