一.什么是Spring Security
S[ing Security是一个基于Java EE框架Spring的安全性框架,它提供了身份认证和授权功能,用于保护应用程序中的资源。同时,它也支持许多常见的身份验证机制,并提供了预防常见攻击,如跨站请求伪造(CSRF)和会话固定等。通过集成到Spring中,Spring Security可以轻松地与其他Spring技术一起使用,如Spring MVC、Spring Boot和Spring Data等。
Spring Security具有以下特点:
- 灵活性:Spring Security提供了多种认证和授权方式,可以根据应用程序的需求进行选择和配置。
- 安全性:Spring Security提供了多层安全防护,包括认证、授权、加密等,可以有效地保护Web应用程序的安全。
- 可扩展性:Spring Security提供了丰富的插件和扩展点,可以根据应用程序的需求进行自定义和扩展。
- 易用性:Spring Security提供了简单易用的API和文档,可以快速地实现安全功能。
总之,Spring Security是一个功能强大、灵活、安全、可扩展和易用的Web应用程序安全框架。由于其灵活、开放和可扩展性,Spring Security已成为Java企业级应用程序中最受欢迎的安全框架之一。
二. Spring Security可以具体做哪些事
Spring Security可以做如下安全性保障:
- 身份认证:提供多种认证方式(如基于表单、HTTP基本认证、OpenID、LDAP等),以确保用户是可信的并且已通过验证。
- 授权访问控制:定义访问规则和权限,对不同用户或角色给予不同程度的访问权限。例如,可以限制某些URL或页面仅允许特定用户或角色访问。
- 防止会话固定攻击(Session Fixation):避免黑客拦截来自合法用户的会话ID,并利用该ID发起攻击。
- 防止跨站点请求伪造(CSRF):在Web应用程序中添加额外的保护层来防止攻击者向受信任的网站发送伪装成合法请求的恶意请求。
- LDAP:集成LDAP服务来进行身份认证、用户管理和权限控制。
- 实现单点登录(SSO)功能:允许用户仅使用一组凭证即可访问多个应用程序。
- Spring Boot安全性启动器(Starter):简化配置和使用,使开发人员能够更快地构建安全的应用程序。
三.Spring Security与Shiro优缺点对比
Spring Security 和 Shiro 都是常用的安全框架,以下是它们的优缺点对比:
Spring Security 的优点:
- 大受欢迎:由于其在大量企业级项目中的广泛应用,因此相对来说更受欢迎。
- 更强大的功能:Spring Security支持OAuth2、OpenID Connect等现代安全性协议和标准,以及与LDAP等其他存储接口的深度整合。
- 完全集成:Spring Security是Spring框架的一部分,开发人员可以通过使用类似Java配置的方式轻松配置和扩展它。
- 易于使用:Spring Security提供了很多已经实现好的安全过滤器、过滤器链等,使得开发人员可以快速构建出具有高度保护能力的安全环境。
Spring Security 的缺点:
- 繁琐的配置:由于Spring Security拥有完善的安全认证、授权、防护等功能,所以需要进行繁琐的配置,并且会带来一些笨重的实现细节。
- 学习曲线较陡峭:由于Spring Security 比Shiro涵盖范围更广,因此学习曲线可能更陡峭。
Shiro 的优点:
- 更小巧灵活:Shiro集成容易、学习曲线较浅,且可以轻松地与Spring无缝集成。
- 活跃的社区:尽管Shiro目前的使用量相对于Spring Security较少,但它仍然有一个强大的开源社区,并持续地发展和改善中。
- 易于定制:Shiro的设计原则之一是可扩展性,因此开发人员可以通过自定义实现或拦截器来完全控制身份验证、授权等。
Shiro 的缺点:
- 功能不如 Spring Security 强大:Shiro虽然也具备认证、授权、防护等功能,但是由于使用范围相比较小,其本身提供的功能相对不够强大。
- 社区可能相对活跃度不足:尽管Shiro社区活跃,但相较于Spring Security还是会显得不足。
根据项目的需要和场景来选择哪种框架更加合适。如果你是一个 Spring 应用程序开发人员,Spring Security 是较好的选择;如果需要一个更灵活的安全框架并且不需要应付复杂业务需求,则 Shiro 较适合。
四. Spring Security的基本原理
Spring Security 基本原理包括以下几个方面:
- 认证(Authentication):验证用户身份是否正确。Spring Security 提供了多种认证方式,例如用户名密码认证、基于 SSO 的认证、OAuth2 认证等。
- 授权(Authorization):控制用户对系统资源的访问权限。授权可以通过角色授权、基于 URL 路径的授权、表达式授权实现等,确保只有获得授权的用户才能访问系统受保护的资源。
- 过滤器链(Filter Chain):Spring Security 将一系列安全过滤器链接到 web 应用程序上下文中的每个请求中,来保证安全功能得以按需执行。安全过滤器是由 WebSecurityConfigurerAdapter 配置统一管理的。
- 用户详细信息(User Details):是 Spring Security 认证过程中必需的数据模型。包含关键信息,如用户名、密码、角色、权限等,可与内存、数据库等不同存储介质进行整合。
- 安全上下文(Security Context):Spring Security 采用线程本地存储(ThreadLocal)方法,将访问者的 Authentication 、 Authorization 等安全相关内容保存起来并一起交给安全管理器管理。无论何时,都可以通过 SecurityContextHolder 来获取当前访问者的安全上下文。
Spring Security 通过这些基本原理设计了一套高度可配置和易扩展的安全框架,可以灵活适应各种不同类型的应用程序。
五.SpringSecurity Web 权限方案
此处,我们主要了解如何快速使用Spring Security这一套框架完成系统的登录鉴权功能,咋们先不说高大上的鉴权,就一步一步先慢慢来,先来做到登录成功,然后来设置权限!套用Spring Security这套安全框架,要想完成登录功能,主要有以下实现途径,稍微列举一下:
第一种:直接在配置文件中进行配置
第二种:拦截过滤器,进行配置
第三种:自定义编写实现类
1.设置登录系统的账号、密码
注:如果不进行设置,将会采用系统默认的用户名user,而且会随机生成密码,可用性不高!
server:
port: 9191
spring:
security:
user:
name: poria
password: poria
2.通过配置类进行配置
@Configuration
public class Secturityconfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
//原始密码
String originPwd = "poria";
//密码加密
String Spassword = passwordEncoder.encode("poria");
//密码校验
auth.inMemoryAuthentication().withUser(originPwd).password(Spassword).roles("admin");
}
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
3.自定义实现类(重中之重)
@Configuration
public class Secturityconfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
@Service
public class UserInfoDetailService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
List<GrantedAuthority> authorities= AuthorityUtils.commaSeparatedStringToAuthorityList("admin");
return new User("poria",new BCryptPasswordEncoder().encode("poria"),authorities);
}
}
此文待完。。。。。。