161
问题: #9.1.3-2 | Spring Security必须配置在一个什么样的bean中
回答: Spring Security必须配置在一个实现了WebSecurityConfigurer的bean中,或者(简单起见)扩展WebSecurityConfigurerAdapter
162
问题: #9.1.3-2 | 为Spring MVC启用Web安全性功能的最简单配置
回答:
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
问题: #9.1.3-3 | @EnableWebMvcSecurity注解还配置了一个Spring MVC参数解析解析器(argument resolver)。这么做的好处?
回答: 这样的话处理器方法就能够通过带有@AuthenticationPrincipal注解的参数获得认证用户的principal(或username)。它同时还配置了一个bean,在使用Spring表单绑定标签库来定义表单时,这个bean会自动添加一个隐藏的跨站请求伪造(cross-site request forgery,CSRF)token输入域。
164
问题: #9.1.3-4 | 重载WebSecurityConfigurerAdapter的configure()方法
回答:
165
问题: #9.1.3-5 | Spring Security满足我们应用的需求,还需要再添加一点配置。具体来讲,需要什么?
回答:
166
问题: #9.2.1-1 | 配置Spring Security使用内存用户存储的代码
回答:
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@EnablewebMvcsecuritypublic 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
问题: #9.2.1-2 | 配置用户详细信息的方法
回答:
168
问题: #9.2.1-3 | 为了配置Spring Security使用以JDBC为支撑的用户存储,所需的最少配置如下所示(代码)
回答:
@AutowiredDataSource dataSource;
@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .jdbcAuthentication() .dataSource(dataSource);}
169
问题: #9.2.4 | 假设我们需要认证的用户存储在非关系型数据库中,如Mongo或Neo4j,在这种情况下,我们需要提供一个自定义的UserDetailsService接口实现。其中userDetailService如何写?
回答:
public interface UserDetailsService { UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;}
170
问题: #9.3-1 | 对每个请求进行细粒度安全性控制的关键在于重载configure(HttpSecurity)方法。如下的代码片段展现了重载的configure(HttpSecurity)方法,它为不同的URL路径有选择地应用安全性
回答:
@Overrideprotected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/spitters/me").authenticated() .antMatchers(HttpMethod.POST, "/spittles").authenticated() .anyRequest().permitAll();}