Spring Security简介

简介

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默认密码是从配置中获取的原因

可以想像,这种用户和密码配置方法是不行的。生产环境是不能把密码写到配置文件中,且还是明文。用户和密码应该是从数据库中取的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值