首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SpringSecurity

SpringSecurity

作者头像
张哥编程
发布2024-12-13 14:42:44
发布2024-12-13 14:42:44
5770
举报
文章被收录于专栏:云计算linux云计算linux

SpringSecurity

本章重点:

1.什么是SpringSecurity

2.在Springboot中使用SpringSecurity安全框架

一、简介

1.1 为什么要使用安全框架

在一个项目中,部分功能需要先登录才能够进行使用,对于登录得用户身份不同,可操作得功能不同,以前可以使用拦截器或者Spring AOP完全完成。代码复杂,功能单一。

1.2 什么是SpringSecurity

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC和AOP功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

1.3 核心功能

  • 认证 (你是谁)
    • 指的是验证某个用户是否是系统中得合法用户,用户是否可以访问该系统,一般要求用户提供用户名和密码进行登录认证。
  • 授权 (你能干什么)
    • 指的是验证某个用户是否有权限执行某个操作,在一个系统中,不同用户所拥有得权限是不同得,系统会根据不同得角色分配不同得功能。

一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。 spring security的主要核心功能为认证和授权,所有的架构也是基于这两个核心功能去实现的。

1.4 框架基本原理

对web项目得资源安全性得保护,最好得方法是使用Filter,对方法进行保护,最好得方式使用AOP。SpringSecurity对项目进行认证和用户得授权时,基于Sevrvlet过滤器Spring AOP,通过各种各样得拦截器来实现的权限控制,提供了安全性解决方案,可以在web项目请求和方法调用过程中处理身份认证和授权,从而实现对项目得安全管理。

其核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式。

S5 (1).png
S5 (1).png

1.5 认证流程

S5 (2).png
S5 (2).png

二、SpringSecurity使用

2.1 创建Springboot项目

2.2 添加SpringSecurity依赖

代码语言:javascript
复制
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

2.3 启动服务

添加SpringSecurity依赖后,Springboot默认使用SpringSecurity。直接访问项目。

SpringSecurity未配置时默认得登录页面,提供默认用户信息:用户名user,密码在服务器启动时自动生成显示在控制台。

S5 (3).png
S5 (3).png
S5 (4).png
S5 (4).png

登录成功跳转到static下得index.html页面。

三、配置SpringSecurity

3.1 使用自定义form表单

3.1.1 创建配置类,继承WebSecurityConfigurer
代码语言:javascript
复制
@Configuration
@EnableWebSecurity
public class SecurityConfiger extends WebSecurityConfigurerAdapter {

}
3.1.2 配置自定义表单
代码语言:javascript
复制
	@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
                .loginPage("/login.html")
                .loginProcessingUrl("/login-check")
                .defaultSuccessUrl("/home.html")
                .failureUrl("/failure.html")
                .usernameParameter("uname")
                .passwordParameter("pwd")
                .permitAll()
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .csrf().disable();
    }

配置SpringSecurity

方法

说明

openidLogin()

用于基于 OpenId 的验证

headers()

将安全标头添加到响应

cors()

配置跨域资源共享( CORS )

sessionManagement()

允许配置会话管理

portMapper()

允许配置一个PortMapper(HttpSecurity#(getSharedObject(class))),其他提供SecurityConfigurer的对象使用 PortMapper 从 HTTP 重定向到 HTTPS 或者从 HTTPS 重定向到 HTTP。默认情况下,Spring Security使用一个PortMapperImpl映射 HTTP 端口8080到 HTTPS 端口8443,HTTP 端口80到 HTTPS 端口443

jee()

配置基于容器的预认证。 在这种情况下,认证由Servlet容器管理

x509()

配置基于x509的认证

rememberMe

允许配置“记住我”的验证

authorizeRequests()

允许基于使用HttpServletRequest限制访问

requestCache()

允许配置请求缓存

exceptionHandling()

允许配置错误处理

securityContext()

在HttpServletRequests之间的SecurityContextHolder上设置SecurityContext的管理。 当使用WebSecurityConfigurerAdapter时,这将自动应用

servletApi()

将HttpServletRequest方法与在其上找到的值集成到SecurityContext中。 当使用WebSecurityConfigurerAdapter时,这将自动应用

csrf()

添加 CSRF 支持,使用WebSecurityConfigurerAdapter时,默认启用

logout()

添加退出登录支持。当使用WebSecurityConfigurerAdapter时,这将自动应用。默认情况是,访问URL”/ logout”,使HTTP Session无效来清除用户,清除已配置的任何#rememberMe()身份验证,清除SecurityContextHolder,然后重定向到”/login?success”

anonymous()

允许配置匿名用户的表示方法。 当与WebSecurityConfigurerAdapter结合使用时,这将自动应用。 默认情况下,匿名用户将使用org.springframework.security.authentication.AnonymousAuthenticationToken表示,并包含角色 “ROLE_ANONYMOUS”

formLogin()

指定支持基于表单的身份验证。如果未指定FormLoginConfigurer#loginPage(String),则将生成默认登录页面

oauth2Login()

根据外部OAuth 2.0或OpenID Connect 1.0提供程序配置身份验证

requiresChannel()

配置通道安全。为了使该配置有用,必须提供至少一个到所需信道的映射

httpBasic()

配置 Http Basic 验证

addFilterAt()

在指定的Filter类的位置添加过滤器

3.2 配置自定义用户

Spring Security要求必须为用户配置提供编码器,否则会报找不到相应的编码器错误

3.2.1 定义密码编码规则
代码语言:javascript
复制
/**
 * 密码编码
 */
public class PasswordEncoderConfig implements PasswordEncoder {

    // 编码
    @Override
    public String encode(CharSequence charSequence) {
        return charSequence.toString();
    }

    /**
     *
     * @param charSequence 表单输入的密码
     * @param s 正确密码
     * @return
     */
    @Override
    public boolean matches(CharSequence charSequence, String s) {
        return s.equals(charSequence.toString());
    }
}
3.2.2 配置自定义用户
代码语言:javascript
复制
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .passwordEncoder(new PasswordEncoderConfig())
                .withUser("zs").password("123").roles("admin")
                .and()
                .withUser("ls").password("111").roles("admin");
    }
3.2.3 基于数据库的用户登录

创建实体类实现UserDetails

代码语言:javascript
复制
public class MyUser implements UserDetails {
    ......
}

创建类实现UserDetailsService

代码语言:javascript
复制
@Component
public class UserConfig implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String uname){
    	// 校验用户信息
        return null;
    }
}

修改用户校验配置

代码语言:javascript
复制
    @Resource
    UserConfig userConfig;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) {
        DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
        daoAuthenticationProvider.setUserDetailsService(userConfig);
        daoAuthenticationProvider.setPasswordEncoder(new PasswordEncoderConfig());
        auth.authenticationProvider(daoAuthenticationProvider);
    }

获取异常信息

异常信息保存在session中,参数名为SPRING_SECURITY_LAST_EXCEPTION

页面上可以通过session获取SPRING_SECURITY_LAST_EXCEPTION来获取异常信息

代码语言:javascript
复制
<p th:text="${session.SPRING_SECURITY_LAST_EXCEPTION.message}"></p>

修改错误提示信息

security中默认异常信息存放在

S5 (5).png
S5 (5).png

在resources目录下新建文件

S5 (6).png
S5 (6).png

3.2 退出

当使用WebSecurityConfigurerAdapter时,这将自动应用。默认情况是,访问URL”/ logout”,使HTTP Session无效来清除用户,清除已配置的任何#rememberMe()身份验证,清除SecurityContextHolder,然后重定向到”/login?success”

建表

代码语言:javascript
复制
CREATE TABLE customer(
    cid NUMBER,
    cname VARCHAR2(10),
    phone VARCHAR2(11),
    sex NUMBER(1),
    isexpired NUMBER(1), -- 是否过期
    islocked NUMBER(1),  -- 是否上锁
    isCreExpired NUMBER(1),-- 认证是否过期
    isenable NUMBER(1) -- 是否禁用
)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringSecurity
  • 本章重点:
  • 一、简介
    • 1.1 为什么要使用安全框架
    • 1.2 什么是SpringSecurity
    • 1.3 核心功能
    • 1.4 框架基本原理
    • 1.5 认证流程
  • 二、SpringSecurity使用
    • 2.1 创建Springboot项目
    • 2.2 添加SpringSecurity依赖
    • 2.3 启动服务
  • 三、配置SpringSecurity
    • 3.1 使用自定义form表单
      • 3.1.1 创建配置类,继承WebSecurityConfigurer
      • 3.1.2 配置自定义表单
    • 3.2 配置自定义用户
      • 3.2.1 定义密码编码规则
      • 3.2.2 配置自定义用户
      • 3.2.3 基于数据库的用户登录
    • 3.2 退出
  • 建表
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档