security

认证流程

导入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>2.6.8</version>
        </dependency>

 导入spring-boot-starter-security启动器后,Spring Security已经生效,默认拦截全部请求,如果用户没有登录,跳转到内置登录页面。

WebSecurityConfigurerAdapter

需要自定义一个类用于继承WebSecurityConfigurerAdapter,并且开启@EnableWebSecurity支持

复制代码
//@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()    
                .antMatchers("/").permitAll()
                .antMatchers("/login.html").hasRole("vip1");
        //没有权限就跳回登陆页面
        http.formLogin();
        //走自己的登陆页面
        //http.formLogin().loginPage("");
        //开启注销功能
        http.logout().logoutSuccessUrl("/main.html");
        //开启记住我功能
        http.rememberMe().rememberMeParameter("remember");
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //auth.jdbcAuthentication().连接数据库的方式
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("hp")
                .password(new BCryptPasswordEncoder().encode("111111"))
                .roles("vip1");
    }
}
复制代码

WebSecurityConfigurerAdapter

提供了一种便利的方式去创建 WebSecurityConfigurer的实例,只需要重写 WebSecurityConfigurerAdapter 的方法,即可配置拦截什么URL、设置什么权限等安全控制。

configure(HttpSecurity http)

匹配的权限是从上到下的,如果前面匹配了被放行,下面匹配的就无效了,使用匹配顺序很重要

该方法定义了哪些URL路径应该被拦截,以及访问资源需要的权限,以及一些功能如记住我,自定义的页面

configure(AuthenticationManagerBuilder auth)

该方法提供访问内存或者数据库等方式去给用户授予角色

解除跨站请求限制

 

PasswordEncoder

为了保证密码的安全性,应该在自定义用于实现WebSecurityConfigurerAdapter中定义密码编码方式

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

UserDetailsService接口详解

自定义逻辑时,只需要实现UserDetailsService接口即可

 UserDetailsService只负责从特定的地方(通常是数据库)加载用户信息,UserDetailsService常见的实现类有JdbcDaoImpl,InMemoryUserDetailsManager

public interface UserDetailsService {
   UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}

loadUserByusername(Sting username)方法

UserDetails接口

这个接口是我们自己用来定义用户表的结构的

SpringSecurity自己的用户信息只包含了Username,password,roles,假如我希望用户的实体类中还有性别sex字段,那么就没有办法了,所以SpringSecurity提供了UserDetails接口,我们可以自己新建一个包含sex字段的类,然后该类implements UserDetails接口,就可以获取我们说的这个sex字段

UserDetails实例是通过UserDetailsService接口的loadUserByUsername方法返回的,可以参考这篇文章创建自己的UserDetails(本文中包含sex的那个类)

UserDetails接口中有一个getAuthorities方法,这个方法返回的是权限,但是我们返回的权限必须带有“ROLE_”开头才可以,spring会自己截取ROLE_后边的字符串,也就是说,比如:我的权限叫ADMIN,那么,我返回告诉spring security的时候,必须告诉他权限是ROLE_ADMIN,这样spring security才会认为权限是ADMIN

会话管理

通过SecurityContextHolder获取用户信息

方法授权

如果选择基于方法的授权,可以不用像什么那样单独对路径进行拦截

@Secured

需要在@Configuration实例上添加@EnableGlobalMethodSecurity(securedEnable=true)注解

@PreAuthorize,@PostAuthorize

需要在@Configuration实例上添加@EnableGlobalMethodSecurity(prePostEnable=true)注解

 

posted @   happy_in  阅读(212)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示