简介
Spring Security:是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。Spring Security主要实现了Authentication(认证,解决who are you?)和AccessControl(访问控制,也就是what are you allowed to do?,也称Authorization)。Spring Security在架构上将认证与授权分离,并提供了扩展点。
在Java生态中,目前有Spring Security和Apache Shiro两个安全框架,可以完成认证和授权的功能。
相同点:
1:认证功能
2:授权功能
3:加密功能
4:会话管理
5:缓存支持
6:rememberMe功能…….
不同点:
优点:
1:Spring Security基于Spring开发,项目中如果使用Spring作为基础,配合Spring Security做权限更加方便,而Shiro需要和Springi进行整合开发
2:Spring Security.功能比Shiro更加丰富些,例如安全防护
3:Spring Security社区资源比Shiro丰富
缺点:
1:Shirol的配置和使用比较简单,Spring Security.上手复杂
2:Shiro依赖性低,不需要任何框架和容器,可以独立运行,而Spring Security依赖于Spring容器
一般来说,常见的安全管理技术栈的组合是这样的:
·SSM+Shiro
Spring Boot/Spring Cloud Spring Security
Spring Security模块
核心模块-spring-security-core.jar:包含核心验证和访问控制类和接口,远程支持的基本配置API,是基本模块
远程调用-spring-security-remoting.jar:提供与Spring Remoting集成
网页-spring-security-Web.jar:包括网站安全的模块,提供网站认证服务和基于URL访问控制
配置-spring-security-config.jar:包含安全命令空间解析代码,若使用XML进行配置则需要
LDAP-spring-security-ldap.jar:LDAP验证和配置,若需要LDAP验证和管理LDAP用户实体
AcL访问控制表-spring-security-aclar:ACL(Access Control List)专门领域对象的实现
CAs-spring-security-cas.jar:CAS(Central Authentication Service)客户端继承,若想用CAS的SSO服务器网页验证
OpenlD-spring-security-openid.jar:OpenlD网页验证支持
Test-spring-security-test.jar:支持Spring Securityl的测试
入门案例
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
@RestController
@RequestMapping("demo")
public class DemoController {
@GetMapping("test1")
public String test1(){
return "test1";
}
}
访问路径: http://localhost:8081/demo/test1
其用户名是user,密码是一个uuid,生成在控制台中
这个用户名和密码是存储在内存中的,如果想手动修改密码,可以这样做
spring:
security:
user:
name: user
password: 123
其底层如下
@ConfigurationProperties(
prefix = "spring.security"
)
public class SecurityProperties {
//忽略代码....
public static class User {
private String name = "user";
private String password = UUID.randomUUID().toString();//这也是,Spring Security模式密码是UUID的原因
private List<String> roles = new ArrayList();
private boolean passwordGenerated = true;
//忽略代码....
}
//忽略代码....
}
Spring Security中UserDetailsService是用来管理用户的,从Spring Security核心组件之用户一文中得知,默认注册的UserDetailsService是InMemoryUserDetailsManager
@Bean
@ConditionalOnMissingBean(
type = "org.springframework.security.oauth2.client.registration.ClientRegistrationRepository")
@Lazy
public InMemoryUserDetailsManager inMemoryUserDetailsManager(SecurityProperties properties,
ObjectProvider<PasswordEncoder> passwordEncoder) {
SecurityProperties.User user = properties.getUser();
List<String> roles = user.getRoles();
return new InMemoryUserDetailsManager(
User.withUsername(user.getName()).password(getOrDeducePassword(user, passwordEncoder.getIfAvailable()))
.roles(StringUtils.toStringArray(roles)).build());
}
这也是为什么Spring Security默认密码是从配置中获取的原因
可以想像,这种用户和密码配置方法是不行的。生产环境是不能把密码写到配置文件中,且还是明文。用户和密码应该是从数据库中取的