Fivk博客 - SpringSecurity
type: channel
link: https://blog.fivk.cn/tag/SpringSecurity/
items: 【SpringSecurity】HttpSecurity相关配置
items: 【基础框架】SpringSecurity从入门到精通

【SpringSecurity】HttpSecurity相关配置
type: item
date: 2023-03-09T17:51:00+08:00
description: [scode type="blue" size="simple"]角色的作用在Spring Security中，角色可以用来控制用户对系统资源的访问权限。默认角色Spring Security中内置了一些默认角色，如ROLE_USER和ROLE_ADMIN。自定义角色可以使用GrantedAuthority接口和SimpleGrantedAuthority类来自定义角色。角色控制访问在配置Spring Security时，可以使用hasRole()方法和hasAnyRole()方法来检查用户是否具有特定的角色。允许匿名访问在配置中也可以使用anonymous()方法来配置允许匿名访问的URL路径。链接重定向当用户未经身份验证访问受保护的URL时，将重定向到该页面。[/scode]1.默认角色的介绍和使用默认角色在Spring Security中有着很重要的作用，可以帮助我们快速地定义访问控制规则。默认角色包括两个，分别是ROLE_USER和ROLE_ANONYMOUS。其中，ROLE_USER表示已认证的用户角色，当用户登录系统后，会自动获得该角色。而ROLE_ANONYMOUS则表示未认证的用户角色，当用户未登录系统时，会自动获得该角色。使用默认角色非常简单，只需要在访问控制规则中将其作为角色名即可，例如：protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/public/**").permitAll() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasRole("USER") .anyRequest().authenticated() .and().formLogin() .and().logout(); }在上面的例子中，我们使用ROLE_USER和ROLE_ANONYMOUS作为默认角色来定义了系统的访问控制规则。对于公共资源/public/**，任何人都可以访问，而对于需要认证的资源，系统会根据用户的角色进行限制。当用户登录后，会自动获得ROLE_USER角色，如果需要管理员权限，则需要具有ADMIN角色。如果用户未登录，则会自动获得ROLE_ANONYMOUS角色，这样就可以限制未认证用户的访问权限，保护系统的安全性。需要注意的是，如果你想修改默认角色的名称或者禁用默认角色，可以通过配置SecurityConfig类的configureGlobal(AuthenticationManagerBuilder auth)方法来实现。具体可以参考Spring Security官方文档的介绍。2. 自定义用户信息和角色信息的数据源Spring Security默认提供了一个内存数据源用于存储用户信息和角色信息，但在实际应用中，我们往往需要从数据库或其他数据源中获取用户信息和角色信息。为此，我们需要实现UserDetailsService接口，并重写loadUserByUsername()方法，从数据源中获取用户信息和角色信息，并返回一个UserDetails对象。例如，下面的代码示例演示了如何从数据库中获取用户信息和角色信息：@Service public class MyUserDetailsService implements UserDetailsService { @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByUsername(username); if (user == null) { throw new UsernameNotFoundException("User not found"); } List<GrantedAuthority> authorities = new ArrayList<>(); for (String role : user.getRoles()) { authorities.add(new SimpleGrantedAuthority(role)); } return new org.springframework.security.core.userdetails.User( user.getUsername(), user…

【基础框架】SpringSecurity从入门到精通
type: item
date: 2023-03-06T09:54:00+08:00
description: 前言本课程和笔记来源于b站：三更草堂链接地址：https://b23.tv/rrFbpDd配套资料：https://pan.baidu.com/s/1UaRJXasdVeF6hCXsQl1nrw提取码：SpringSecurity从入门到精通课程介绍0. 简介Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro，它提供了更丰富的功能，社区资源也比Shiro丰富。一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多，因为相比与SpringSecurity，Shiro的上手更加的简单。一般Web应用的需要进行认证和授权。认证：验证当前访问系统的是不是本系统的用户，并且要确认具体是哪个用户授权：经过认证后判断当前用户是否有权限进行某个操作而认证和授权也是SpringSecurity作为安全框架的核心功能。1. 快速入门1.1 准备工作我们先要搭建一个简单的SpringBoot工程① 设置父工程 添加依赖<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.0</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>② 创建启动类@SpringBootApplication public class SecurityApplication { public static void main(String[] args) { SpringApplication.run(SecurityApplication.class,args); } }③ 创建Controllerimport org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @RequestMapping("/hello") public String hello(){ return "hello"; } }1.2 引入SpringSecurity在SpringBoot项目中使用SpringSecurity我们只需要引入依赖即可实现入门案例。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>引入依赖后我们在尝试去访问之前的接口就会自动跳转到一个SpringSecurity的默认登陆页面，默认用户名是user,密码会输出在控制台。必须登陆之后才能对接口进行访问。2. 认证2.1 登陆校验流程2.2 原理初探想要知道如何实现自己的登陆流程就必须要先知道入门案例中SpringSecurity的流程。2.2.1 SpringSecurity完整流程SpringSecurity的原理其实就是一个过滤器链，内部包含了提供各种功能的过滤器。这里我们可以看看入门案例中的过滤器。图中只展示了核心过滤器，其它的非核心过滤器并没有在图中展示。UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求。入门案例的认证工作主要有它负责。ExceptionTranslationFilter：处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException 。FilterSecurityInterceptor：负责权限校验的过滤器。我们可以通过Debug查看当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序。…