1. 背景
本节我们学习 Spring Security 。
2.知识
Spring Security 是一个提供身份验证、授权和针对常见攻击的保护的框架。
Spring Secrity 能够在Web请求级别和方法调用级别处理身份认证和授权。
Spring Secrity 通过 filter 来实现认证,DelegatingFilterProxy是一个特殊的Servlet Filter,它本身所做的工作并不多。只是将工作委托给一个javax.servlet.Filter实现类。.
Spring Security 一般要配置这些:
- 用户存储的配置(如何存储用户信息)
- 指定哪些请求需要认证,预计需要的权限
- 自定义登录页面
Spring Security 非常灵活,能够基于各种用户存储来做认证:内存,数据库,LDAP,自定义等
3. 示例
1) 引用依赖库
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring-security-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring-security-version}</version>
</dependency>
使用 @EnableWebSecurity 注解启用Web安全功能。
/**
* @EnableWebSecurity 注解将会启用Web安全功能。
* Spring Security必须配置在一个实现了 WebSecurityConfigurer的bean中,或者继承WebSecurityConfigurerAdapter
*/
@Configuration
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
// 启用 内存数据存储
auth.inMemoryAuthentication()
.passwordEncoder(passwordEncoder)
.withUser("user").password(passwordEncoder.encode("123")).roles("USER").and()
.withUser("admin").password(passwordEncoder.encode("admin")).roles("USER", "ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()// 启用默认登录页
.and()
.authorizeRequests()
// .antMatchers("/manage/**").authenticated()
.antMatchers("/manage/**").hasRole("ADMIN")
.anyRequest().permitAll();
}
}
上面代码有两个配置方法:
- configure(AuthenticationManagerBuilder auth) :配置了内存存储用户信息,并增加了两个账号。
- configure(HttpSecurity http) :配置了请求需要认证。
我的代码见:https://github.com/vir56k/java_demo/tree/master/spring_security_demo_1
网友评论