《Spring实战》摘录 - 17
161
Q: #9.1.3-2 | Spring Security必须配置在一个什么样的bean中
A: Spring Security必须配置在一个实现了WebSecurityConfigure
r的bean中,或者(简单起见)扩展WebSecurityConfigurerAdapter
#162
Q: #9.1.3-2 | 为Spring MVC启用Web安全性功能的最简单配置
A:
package spitter. config:
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnablewebMvcsecurity;
@Configuration
@EnableWebMvcSecurity//启用SpringMVC安全性
public class Securityconfig extends WebSecurityConfigurerAdapter {...}
#163
Q: #9.1.3-3 | @EnableWebMvcSecurity
注解还配置了一个Spring MVC参数解析解析器(argument resolver)。这么做的好处?
A: 这样的话处理器方法就能够通过带有@AuthenticationPrincipal
注解的参数获得认证用户的principal(或username)。它同时还配置了一个bean,在使用Spring表单绑定标签库来定义表单时,这个bean会自动添加一个隐藏的跨站请求伪造(cross-site request forgery,CSRF)token输入域。
#164
Q: #9.1.3-4 | 重载WebSecurityConfigurerAdapter
的configure()方法
A:
- configure(WebSecurity) --- 通过重载,配置Spring Security的Filter链
- configure(HttpSecurity) --- 通过重载,配置如何通过拦截器保护请求
- configure(AuthenticationManagerBuilder) --- 通过重载,配置user-detail服务
#165
Q: #9.1.3-5 | Spring Security满足我们应用的需求,还需要再添加一点配置。具体来讲,需要什么?
A:
- 配置用户存储;
- 指定哪些请求需要认证,哪些请求不需要认证,以及所需要的权限;
- 提供一个自定义的登录页面,替代原来简单的默认登录页。
#166
Q: #9.2.1-1 | 配置Spring Security使用内存用户存储的代码
A:
package spitter. config:
import org.springframework.beans.factory.annotation.Autowired:
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity:
@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");
}
}
#167
Q: #9.2.1-2 | 配置用户详细信息的方法
A:
- accountExpired(boolean) --- 定义账号是否已经过期
- accountLocked(boolean) --- 定义账号是否已经锁定
- and() --- 用来连接配置
- authorities(GrantedAuthority...) --- 授予某个用户一项或多项权限
- authorities(List<? extends GrantedAuthority>) --- 授予某个用户一项或多项权限
- authorities(String...) --- 授予某个用户一项或多项权限
- credentialsExpired(boolean) --- 定义凭证是否已经过期
- disabled(boolean) --- 定义账号是否已被禁用
- password(String) --- 定义用户的密码
- roles(String...) --- 授予某个用户一项或多项角色
#168
Q: #9.2.1-3 | 为了配置Spring Security使用以JDBC为支撑的用户存储,所需的最少配置如下所示(代码)
A:
@Autowired
DataSource dataSource;
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth
.jdbcAuthentication()
.dataSource(dataSource);
}
#169
Q: #9.2.4 | 假设我们需要认证的用户存储在非关系型数据库中,如Mongo或Neo4j,在这种情况下,我们需要提供一个自定义的UserDetailsService接口实现。其中userDetailService如何写?
A:
public interface UserDetailsService {
UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException;
}
#170
Q: #9.3-1 | 对每个请求进行细粒度安全性控制的关键在于重载configure(HttpSecurity)
方法。如下的代码片段展现了重载的configure(HttpSecurity)
方法,它为不同的URL路径有选择地应用安全性
A:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/spitters/me").authenticated()
.antMatchers(HttpMethod.POST, "/spittles").authenticated()
.anyRequest().permitAll();
}