1.什么是SpringSecurity
2.在Springboot中使用SpringSecurity安全框架
在一个项目中,部分功能需要先登录才能够进行使用,对于登录得用户身份不同,可操作得功能不同,以前可以使用拦截器或者Spring AOP完全完成。代码复杂,功能单一。
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC和AOP功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。 spring security的主要核心功能为认证和授权,所有的架构也是基于这两个核心功能去实现的。
对web项目得资源安全性得保护,最好得方法是使用Filter,对方法进行保护,最好得方式使用AOP。SpringSecurity对项目进行认证和用户得授权时,基于Sevrvlet过滤器和Spring AOP,通过各种各样得拦截器来实现的权限控制,提供了安全性解决方案,可以在web项目请求和方法调用过程中处理身份认证和授权,从而实现对项目得安全管理。
其核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式。


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>添加SpringSecurity依赖后,Springboot默认使用SpringSecurity。直接访问项目。
SpringSecurity未配置时默认得登录页面,提供默认用户信息:用户名user,密码在服务器启动时自动生成显示在控制台。


登录成功跳转到static下得index.html页面。
@Configuration
@EnableWebSecurity
public class SecurityConfiger extends WebSecurityConfigurerAdapter {
} @Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.loginPage("/login.html")
.loginProcessingUrl("/login-check")
.defaultSuccessUrl("/home.html")
.failureUrl("/failure.html")
.usernameParameter("uname")
.passwordParameter("pwd")
.permitAll()
.and()
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.csrf().disable();
}配置SpringSecurity
方法 | 说明 |
|---|---|
openidLogin() | 用于基于 OpenId 的验证 |
headers() | 将安全标头添加到响应 |
cors() | 配置跨域资源共享( CORS ) |
sessionManagement() | 允许配置会话管理 |
portMapper() | 允许配置一个PortMapper(HttpSecurity#(getSharedObject(class))),其他提供SecurityConfigurer的对象使用 PortMapper 从 HTTP 重定向到 HTTPS 或者从 HTTPS 重定向到 HTTP。默认情况下,Spring Security使用一个PortMapperImpl映射 HTTP 端口8080到 HTTPS 端口8443,HTTP 端口80到 HTTPS 端口443 |
jee() | 配置基于容器的预认证。 在这种情况下,认证由Servlet容器管理 |
x509() | 配置基于x509的认证 |
rememberMe | 允许配置“记住我”的验证 |
authorizeRequests() | 允许基于使用HttpServletRequest限制访问 |
requestCache() | 允许配置请求缓存 |
exceptionHandling() | 允许配置错误处理 |
securityContext() | 在HttpServletRequests之间的SecurityContextHolder上设置SecurityContext的管理。 当使用WebSecurityConfigurerAdapter时,这将自动应用 |
servletApi() | 将HttpServletRequest方法与在其上找到的值集成到SecurityContext中。 当使用WebSecurityConfigurerAdapter时,这将自动应用 |
csrf() | 添加 CSRF 支持,使用WebSecurityConfigurerAdapter时,默认启用 |
logout() | 添加退出登录支持。当使用WebSecurityConfigurerAdapter时,这将自动应用。默认情况是,访问URL”/ logout”,使HTTP Session无效来清除用户,清除已配置的任何#rememberMe()身份验证,清除SecurityContextHolder,然后重定向到”/login?success” |
anonymous() | 允许配置匿名用户的表示方法。 当与WebSecurityConfigurerAdapter结合使用时,这将自动应用。 默认情况下,匿名用户将使用org.springframework.security.authentication.AnonymousAuthenticationToken表示,并包含角色 “ROLE_ANONYMOUS” |
formLogin() | 指定支持基于表单的身份验证。如果未指定FormLoginConfigurer#loginPage(String),则将生成默认登录页面 |
oauth2Login() | 根据外部OAuth 2.0或OpenID Connect 1.0提供程序配置身份验证 |
requiresChannel() | 配置通道安全。为了使该配置有用,必须提供至少一个到所需信道的映射 |
httpBasic() | 配置 Http Basic 验证 |
addFilterAt() | 在指定的Filter类的位置添加过滤器 |
Spring Security要求必须为用户配置提供编码器,否则会报找不到相应的编码器错误
/**
* 密码编码
*/
public class PasswordEncoderConfig implements PasswordEncoder {
// 编码
@Override
public String encode(CharSequence charSequence) {
return charSequence.toString();
}
/**
*
* @param charSequence 表单输入的密码
* @param s 正确密码
* @return
*/
@Override
public boolean matches(CharSequence charSequence, String s) {
return s.equals(charSequence.toString());
}
} @Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.passwordEncoder(new PasswordEncoderConfig())
.withUser("zs").password("123").roles("admin")
.and()
.withUser("ls").password("111").roles("admin");
}创建实体类实现UserDetails
public class MyUser implements UserDetails {
......
}创建类实现UserDetailsService
@Component
public class UserConfig implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String uname){
// 校验用户信息
return null;
}
}修改用户校验配置
@Resource
UserConfig userConfig;
@Override
protected void configure(AuthenticationManagerBuilder auth) {
DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
daoAuthenticationProvider.setUserDetailsService(userConfig);
daoAuthenticationProvider.setPasswordEncoder(new PasswordEncoderConfig());
auth.authenticationProvider(daoAuthenticationProvider);
}获取异常信息
异常信息保存在session中,参数名为SPRING_SECURITY_LAST_EXCEPTION
页面上可以通过session获取SPRING_SECURITY_LAST_EXCEPTION来获取异常信息
<p th:text="${session.SPRING_SECURITY_LAST_EXCEPTION.message}"></p>修改错误提示信息
security中默认异常信息存放在

在resources目录下新建文件

当使用WebSecurityConfigurerAdapter时,这将自动应用。默认情况是,访问URL”/ logout”,使HTTP Session无效来清除用户,清除已配置的任何#rememberMe()身份验证,清除SecurityContextHolder,然后重定向到”/login?success”
CREATE TABLE customer(
cid NUMBER,
cname VARCHAR2(10),
phone VARCHAR2(11),
sex NUMBER(1),
isexpired NUMBER(1), -- 是否过期
islocked NUMBER(1), -- 是否上锁
isCreExpired NUMBER(1),-- 认证是否过期
isenable NUMBER(1) -- 是否禁用
)