Spring Security实现详解

这篇具有很好参考价值的文章主要介绍了Spring Security实现详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、WebSecurityConfigurerAdapter 总配置类:

1、介绍:配置类

2、主要方法:

(1)configure(HttpSecurity http)

protected void configure(HttpSecurity http) throws Exception {
        this.logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).");
        ((HttpSecurity)((HttpSecurity)((AuthorizedUrl)http.authorizeRequests().anyRequest()).authenticated().and()).formLogin().and()).httpBasic();
    }

 可以看到 WebSecurityConfigurerAdapter 已经默认声明了一些安全特性:

  ① 验证所有用户请求;

  ② 允许用户使用表单登录进行身份验证(Spring Security 提供了一个简单的表单登录页面);

  ③ 允许用户使用 HTTP 基本认证。

3、使用方法:自定义一个类如WebSecurityConfig 继承WebSecurityConfigurerAdapter抽象类,WebSecurityConfig 类上加上 @EnableWebSecurity 注解后,便会自动被 Spring 发现并注册(点击 @EnableWebSecurity 注解可以看到 @Configuration 注解已经存在,所以此处不需要额外添加)。

二、HttpSecurity:

1、作用:  HttpSecurity 实际上对应了 Spring Security 命名空间配置方式中 xml 文件内的标签。允许我们为特定的 http 请求配置安全策略。HttpSecurity 首先被设计为链式调用,在执行每个方法后,都会返回一个预期的上下文,便于连续调用,除非使用 and() 方法结束当前标签,上下文才会回到 HttpSecurity ,否则链式调用的上下文将自动进入对应的标签域。

2、主要方法: HttpSecurity 提供了很多配置相关的方法,分别对应命名空间配置中的子标签 <http>,如:

(1)authorizeRequests():对应 <intercept-url>标签,该方法实际上返回了一个 URL 拦截注册器,我们可以调用它提供的 anyRequest()、antMatchers() 和 regexMatchers() 等方法来匹配系统的 URL ,并为其指定安全策略。

(2)formLogin():对应<form-login>,formLogin.loginPage("/myLogin.html") 指定自定义的登录页为 /myLogin.html ,同时,Spring Security 会用 /myLogin.html 注册一个 POST 路由,用于接收登录请求。

(3)httpBasic() :对应<http-basic>标签,formLogin() 和 httpBasic() 方法都声明了需要 Spring Security 提供的表单认证方式,分别返回对应的配置器。

(4) csrf() :对应 <csrf>标签 ,是 Spring Security 提供的跨站请求伪造防护功能,当我们继承 WebSecurityConfigurerAdapter 会默认开启 csrf() 方法

三、认证数据源UserDetailsService 

1、介绍:Spring Security 支持各种来源的用户数据,包括内存、数据库、LDAP 等。它们被抽象为一个 UserDetailsService 接口,任何实现了 UserDetailsService 接口的对象都可以作为认证数据源。在这种设计模式下,Spring Security 显得尤为灵活。

package org.springframework.security.core.userdetails;

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

2、实现类:

(1)InMemoryUserDetailsManager :将用户数据源寄存在内存里,在一些不需要引入数据库这种重数据源的系统中很有帮助。

(2)JdbcUserDetailsManager:

(3)自定义实现类:实现UserDetailsService接口。如

import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;

@Service("jwtUserService")
public class JwtUserServiceImpl implements UserDetailsService {

    @Autowired
    private UserDOMapper userDOMapper;

    @Autowired
    private UserMenuMapper userMenuMapper;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserDO userDO = userDOMapper.getNonFieldAccountByAccountOrPhone(username);
        if(userDO == null){
            throw new UsernameNotFoundException("用户不存在");
        }
        // 查询用户菜单权限
        List<MenuVO> menuVOList = userMenuMapper.listMenuByAccount(username,);
        return new JwtUser(userDO.getId(),userDO.getAccount()
                userDO.getName(), menuVOList);
    }

}

其中的用户对象也重写了:

package com.security.demo.dto;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.List;


public class JwtUser implements UserDetails {


    //用户id
    private String id;
    //用户账号
    private String account;
    //用户名
    private String name;
    //菜单
    private List<MenuVO> menuVOList;


    public JwtUser(){

    }

    public JwtUser(String id,String account,String name,List<MenuVO> menuVOList){
        this.id = id;
        this.account = account;
        this.name = name;
        this.menuVOList = menuVOList;
    }


    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    @Override
    public String getPassword() {
        return null;
    }

    @Override
    public String getUsername() {
        return name;
    }

    @Override
    public boolean isAccountNonExpired() {
        return false;
    }

    @Override
    public boolean isAccountNonLocked() {
        return false;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return false;
    }

    @Override
    public boolean isEnabled() {
        return false;
    }
}

 3、使用方法:只需要为自定义UserDetailsService数据源类加上@bean 注解,便可被 Spring Security 发现并使用。

四、用户对象UserDetails 

1、介绍:

public interface UserDetails extends Serializable {
 
    Collection<? extends GrantedAuthority> getAuthorities();
 
    String getPassword();
 
    String getUsername();
 
    boolean isAccountNonExpired();
 
    boolean isAccountNonLocked();
 
    boolean isCredentialsNonExpired();
 
    boolean isEnabled();
 }

2、使用方法:使用时一般实现UserDetails,自定义业务字段即可。如上面的JWTUser。文章来源地址https://www.toymoban.com/news/detail-806360.html

到了这里,关于Spring Security实现详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • SpringCloud gateway+Spring Security + JWT实现登录和用户权限校验

    SpringCloud gateway+Spring Security + JWT实现登录和用户权限校验

    原本打算将Security模块与gateway模块分开写的,但想到gateway本来就有过滤的作用 ,于是就把gateway和Security结合在一起了,然后结合JWT令牌对用户身份和权限进行校验。 Spring Cloud的网关与传统的SpringMVC不同,gateway是基于Netty容器,采用的webflux技术,所以gateway模块不能引入spri

    2024年02月03日
    浏览(14)
  • 【Spring Security系列】Spring Security整合JWT:构建安全的Web应用

    【Spring Security系列】Spring Security整合JWT:构建安全的Web应用

    在企业级开发或者我们自己的课程设计中,确保用户数据的安全性和访问控制非常重要。而Spring Security和JWT是都两个强大的工具,它俩结合可以帮助我们实现这一目标。 Spring Security提供了全面的安全功能,而JWT则是一种用于身份验证的令牌机制。 前面两个章节介绍过了Spri

    2024年04月23日
    浏览(12)
  • Spring Security in Action 第三章 SpringSecurity管理用户

    Spring Security in Action 第三章 SpringSecurity管理用户

    本专栏将从基础开始,循序渐进,以实战为线索,逐步深入SpringSecurity相关知识相关知识,打造完整的SpringSecurity学习步骤,提升工程化编码能力和思维能力,写出高质量代码。希望大家都能够从中有所收获,也请大家多多支持。 专栏地址:SpringSecurity专栏 本文涉及的代码都已

    2024年02月07日
    浏览(10)
  • spring boot security使用jwt认证

    spring boot security使用jwt认证

    在前面的几篇文章中: spring boot security快速使用示例 spring boot security之前后端分离配置 spring boot security自定义认证 spring boot security验证码登录示例 基本对常用的基于cookie和session的认证使用场景都已覆盖。但是session属于有状态认证,本文给出一个无状态的认证:jwt认证示例。

    2024年02月12日
    浏览(11)
  • Spring Security 构建基于 JWT 的登录认证

    Spring Security 构建基于 JWT 的登录认证

    一言以蔽之,JWT 可以携带非敏感信息,并具有不可篡改性。可以通过验证是否被篡改,以及读取信息内容,完成网络认证的三个问题:“你是谁”、“你有哪些权限”、“是不是冒充的”。   为了安全,使用它需要采用 Https 协议,并且一定要小心防止用于加密的密钥泄露。

    2024年02月16日
    浏览(10)
  • SpringSecurity实现角色权限控制(SpringBoot+SpringSecurity+JWT)

    SpringSecurity实现角色权限控制(SpringBoot+SpringSecurity+JWT)

    通过 springboot整合jwt和security ,以用户名/密码的方式进行认证和授权。认证通过jwt+数据库的,授权这里使用了两种方式,分别是 SpringSecurity自带的hasRole方法+SecurityConfig 和 我们自定义的 permission+@PreAuthorize注解。 SpringSecurity中的几个重要组件: 1.SecurityContextHolder(class) 用来

    2024年02月05日
    浏览(13)
  • spring-security -oauth2 整合 JWT

    spring-security -oauth2 整合 JWT

    在这个基础上,进行整合。 spring security oauth2学习 -- 快速入门_本郡主是喵的博客-CSDN博客 先把  reids,common-pools  等依赖删掉。 删掉redis的下相关配置 1.1 导入依赖 1.2 核心代码 创建 jwtTokenConfig.java 在 AuthenticationServer.java 里面新增这些。  运行,启动!  复制这个token去官网解析

    2024年02月09日
    浏览(14)
  • Spring Security OAuth 2.0 资源服务器— JWT

    Spring Security OAuth 2.0 资源服务器— JWT

    目录 一、JWT的最小依赖 二、JWT的最基本配置 1、指定授权服务器 2、初始预期(Startup Expectations) 3、运行时预期(Runtime Expectations) 三、JWT认证是如何工作的 四、直接指定授权服务器 JWK Set Uri 五、提供 audiences 六、覆盖或取代启动自动配置 1、使用jwkSetUri() 2、使用decoder()

    2024年02月05日
    浏览(9)
  • SpringBoot2.3集成Spring Security(二) JWT认证

    SpringBoot2.3集成Spring Security(二) JWT认证

    紧接上文,我们已经完成了 SpringBoot中集成Spring Security,并且用户名帐号和密码都是从数据库中获取。但是这种方式还是不能满足现在的开发需求。 使用JWT的好处: 无状态认证:JWT本身包含了认证信息和声明,服务器不需要在会话中保存任何状态。这样使得应用程序可以更加

    2024年02月11日
    浏览(11)
  • Spring Security实现详解

    一、WebSecurityConfigurerAdapter 总配置类: 1、介绍:配置类 2、主要方法: (1)configure(HttpSecurity http)  可以看到 WebSecurityConfigurerAdapter 已经默认声明了一些安全特性:   ① 验证所有用户请求;   ② 允许用户使用表单登录进行身份验证(Spring Security 提供了一个简单的表单登

    2024年01月19日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包