Spring Security OAuth2.0(3):Spring Security简单入门

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

前言

Spring Security 快速入门。

本章代码已分享至Gitee:https://gitee.com/lengcz/security-spring-security

一、Spring Security 介绍

\qquad Spring Secutiry 是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是Spring生态系统的一员,因此它伴随着整个Spring生态系统不断修正、升级,在Springboot项目中加入spring security 更是十分简单,使用Spring Security 减少了为企业系统安全控制编写大量重复代码的工作。

二、创建工程

  1. 创建maven工程(不需要模板)
    Spring Security OAuth2.0(3):Spring Security简单入门,spring security oAuth2.0,spring,java,后端

需要创建的目录结构如下
Spring Security OAuth2.0(3):Spring Security简单入门,spring security oAuth2.0,spring,java,后端

  1. 导入spring-security的依赖
  <!--spring-security依赖-->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>5.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>5.1.4.RELEASE</version>
        </dependency>

完整的pom文件如下(包含SpringMvc),下内容供参考

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.it2</groupId>
    <artifactId>security-spring-security</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.12</version>
        </dependency>

        <!--spring-security依赖-->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>5.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>5.1.4.RELEASE</version>
        </dependency>

    </dependencies>
    <build>
        <finalName>security-springmvc</finalName>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <configuration>
                        <encoding>utf-8</encoding>
                        <useDefaultDelimiters>true</useDefaultDelimiters>
                        <resources>
                            <resource>
                                <directory>src/main/resources</directory>
                                <filtering>true</filtering>
                                <includes>
                                    <include>**/*</include>
                                </includes>
                            </resource>
                            <resource>
                                <directory>src/main/java</directory>
                                <filtering>true</filtering>
                                <includes>
                                    <include>**/*.xml</include>
                                </includes>
                            </resource>
                        </resources>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

</project>
  1. Spring容器配置
/**
 * config包下定义ApplicationConfig.java,它对应web.xml中ContextLoaderListener的配置
 */
@Configuration  //相当于ApplicationContext.xml
@ComponentScan(basePackages = "com.it2.security.springmvc",
        excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class)})
public class ApplicationConfig {
    //在此配置除了Controller的其它bean,比如:数据库连接池,事务管理器,业务bean等

}
  1. Servlet Context配置
@Configuration //相当于springmvc.xml
@EnableWebMvc
@ComponentScan(basePackages = "com.it2.security",
        includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class)})
public class WebConfig implements WebMvcConfigurer {

    //视图解析器
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/view/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

    /**
     * spring-scurity 已经包含了权限的拦截器,所以不需要添加权限拦截器
     */
//    @Autowired
//    private SimpleAuthenticationInterceptor simpleAuthenticationInterceptor;
//
//    @Override
//    public void addInterceptors(InterceptorRegistry registry) {
//        registry.addInterceptor(simpleAuthenticationInterceptor).addPathPatterns("/r/**");
//    }
}
  1. 加载Spring容器
    在init包下定义Spring容器初始化类SpringApplicationInitializer,此类实现WebApplicationInitializer接口,Spring容器启动时加载WebApplicationInitializer接口的所有实现类。
public class SpringApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    //spring容器
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{ApplicationConfig.class};
    }

    //servletContext
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    //url-mapping
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

三、认证

1. 认证页面

Spring Security 默认提供了认证的页面,不需要额外开发。
Spring Security OAuth2.0(3):Spring Security简单入门,spring security oAuth2.0,spring,java,后端

2. 安全配置

spring security 提供了用户名密码登录、退出、会话管理等认证功能,只需要配置即可使用。
(1)在config包下定义WebSecutiryConfig,安全配置的内容包含了用户信息、密码编码器、安全拦截机制。

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


    //定义用户信息服务
    @Bean
    public UserDetailsService userDetailsService() {
        //这里示例使用内存的方式存储用户名、密码和权限
        InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();
        inMemoryUserDetailsManager.createUser(User.withUsername("zhangsan").password("111").authorities("p1").build());
        inMemoryUserDetailsManager.createUser(User.withUsername("lisi").password("222").authorities("p2").build());
        return inMemoryUserDetailsManager;
    }

    //密码编码器
    @Bean
    public PasswordEncoder passwordEncoder() { //原文密码比较
        return NoOpPasswordEncoder.getInstance();
    }


    //配置安全拦截机制
    protected void configure(HttpSecurity security) throws Exception {
        security.authorizeRequests()
                .antMatchers("/r/r1").hasAnyAuthority("p1")
                .antMatchers("/r/r2").hasAnyAuthority("p2")
                .antMatchers("/r/**").authenticated() //所有/r/**的请求都必须认证通过
                .anyRequest().permitAll() //除此之外的请求,都可以访问
                .and()
                .formLogin() //允许表单登录
                .successForwardUrl("/login-success");//自定义登录成功后的页面地址

    }

}

在configure中的配置

  • url匹配/r/**的资源,经过认证才可以访问呢
  • 支持form表单认证,认证成功跳转/login-success

(2) 加载WebSecurityConfig
修改SpringApplicationInitializer的getRootConfigClasses()方法,添加WebSecutiryConfig.class

    //spring容器
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{ApplicationConfig.class, WebSecurityConfig.class};
    }

Spring Security OAuth2.0(3):Spring Security简单入门,spring security oAuth2.0,spring,java,后端
(3) Spring Security初始化
Spring Security 初始化,这里有两种情况:

  • 若当前环境没有使用Spring或者SpringMVC,则需要将WebSecurity(Spring Secutiry配置类)传入超类,以确保获取配置,并创建spring context。
  • 相反,若当前环境已经加载使用spring,则应该在现有的springcontext中注册Spring Security(上一步已经将WebSecurityConfig加载到 rootcontext),此方法可以什么都不做。
    在init 包下定义SpringSecurityApplicationInitializer
public class SpringSecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

    public SpringSecurityApplicationInitializer() {
//        super(WebSecurityConfig.class);
    }
}

(4) 配置默认根路径跳登录
在WebConfig.java中添加默认请求根路径跳转到/login,此url为spring security提供

  //指向登录页面
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("redirect:/login");//spring-security默认提供的登录页面
    }

(5) 设置登录后跳转的页面

@RestController
@RestController
public class LoginController {


    @RequestMapping(value = "/login-success", produces = "text/plain;charset=utf-8")
    public String login() {
        return "登录成功";
    }

    @RequestMapping(value = "/r/r1", produces = "text/plain;charset=utf-8")
    public String resources1() {
            return "r1资源";
    }

    @RequestMapping(value = "/r/r2", produces = "text/plain;charset=utf-8")
    public String resources2() {
        return "r2资源";
    }

}

Spring Security OAuth2.0(3):Spring Security简单入门,spring security oAuth2.0,spring,java,后端
(6)配置启动参数,并启动服务
Spring Security OAuth2.0(3):Spring Security简单入门,spring security oAuth2.0,spring,java,后端

如果直接访问/r/r1资源,因为配置了拦截所有请求需要认证,所以它会跳到登录页面。
Spring Security OAuth2.0(3):Spring Security简单入门,spring security oAuth2.0,spring,java,后端
如果登录后,在访问/r/r1资源,则没有问题
Spring Security OAuth2.0(3):Spring Security简单入门,spring security oAuth2.0,spring,java,后端
Spring Security OAuth2.0(3):Spring Security简单入门,spring security oAuth2.0,spring,java,后端
Spring Security OAuth2.0(3):Spring Security简单入门,spring security oAuth2.0,spring,java,后端

到这里就登录成功了。

(7) 退出
spring security提供了退出的请求,访问/logout即可。
Spring Security OAuth2.0(3):Spring Security简单入门,spring security oAuth2.0,spring,java,后端

四、授权

实现授权需要对用户的访问进行拦截校验,校验用户的权限是否可以操作指定的资源,Spring Security默认提供授权实现方法。
签名我们在LoginController添加了/r/r1和/r/r2两个链接的请求资源。

 @RequestMapping(value = "/r/r1", produces = "text/plain;charset=utf-8")
    public String resources1() {
            return "r1资源";
    }

    @RequestMapping(value = "/r/r2", produces = "text/plain;charset=utf-8")
    public String resources2() {
        return "r2资源";
    }

分别配置/r/r1和/r/r2需要的权限

//定义用户信息服务
    @Bean
    public UserDetailsService userDetailsService() {
        //这里示例使用内存的方式存储用户名、密码和权限
        InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();
        inMemoryUserDetailsManager.createUser(User.withUsername("zhangsan").password("111").authorities("p1").build());
        inMemoryUserDetailsManager.createUser(User.withUsername("lisi").password("222").authorities("p2").build());
        return inMemoryUserDetailsManager;
    }

    //配置安全拦截机制
    protected void configure(HttpSecurity security) throws Exception {
        security.authorizeRequests()
                .antMatchers("/r/r1").hasAnyAuthority("p1")
                .antMatchers("/r/r2").hasAnyAuthority("p2")
                .antMatchers("/r/**").authenticated() //所有/r/**的请求都必须认证通过
                .anyRequest().permitAll() //除此之外的请求,都可以访问
                .and()
                .formLogin() //允许表单登录
                .successForwardUrl("/login-success");//自定义登录成功后的页面地址

    }

Spring Security OAuth2.0(3):Spring Security简单入门,spring security oAuth2.0,spring,java,后端
authorities(a,b,c) 拥有a,b,c的权限
.antMatchers(“/r/r1”).hasAnyAuthority(“p1”,“p3”,“p4”) 访问/r/r1需要p1/p3/p4权限之中任意一个。

启动服务器测试
登录了zhangsan后,分别访问/r/r1和/r/r2请求,可以看到zhangsan只能访问/r/r1,而访问r/r2时显示403 Forbidden,表示zhangsan没有/r/r2的权限。
Spring Security OAuth2.0(3):Spring Security简单入门,spring security oAuth2.0,spring,java,后端文章来源地址https://www.toymoban.com/news/detail-542065.html

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

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

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

相关文章

  • Spring Security OAuth2.0 - 学习笔记

    OAuth2.0是一个开放标准,允许用户授权第三方应用程序访问他们存储在另外的服务提供者上的信息,而不需要将用户和密码提供给第三方应用或分享数据的所有内容。 1)授权码模式 2)简化模式 3)密码模式 4)客户端模式 普通令牌只是一个随机的字符串,没有特殊的意义,

    2024年02月16日
    浏览(50)
  • 微服务安全Spring Security Oauth2实战

    Spring Authorization Server 是一个框架,它提供了 OAuth 2.1 和 OpenID Connect 1.0 规范以及其他相关规范的实现。它建立在 Spring Security 之上,为构建 OpenID Connect 1.0 身份提供者和 OAuth2 授权服务器产品提供了一个安全、轻量级和可定制的基础。说白了,Spring Authorization Server 就是一个**认

    2024年02月03日
    浏览(39)
  • Spring Security与OAuth2的完美结合

    OAuth2是一种流行的授权框架,它允许用户授权第三方应用程序访问他们的资源。Spring Security是一个强大的安全框架,它提供了一系列的安全功能。本文将介绍如何将Spring Security与OAuth2整合,以实现更加安全和可靠的应用程序。 OAuth2的基本概念 OAuth2是一个授权框架,它允许用

    2024年02月05日
    浏览(45)
  • Spring Security实现OAuth2协议及实战

    文章篇幅较长,愿读者耐心看完。如有不足之处,请指正。 一.OAuth2介绍 1.1 OAuth2是什么 怎么用 OAuth2是目前最流行的授权协议,用来授权第三方应用,获取用户数据。 举个例子:快递员想要进入小区,有3种方式。1是业主远程开门,2是业主告诉门禁密码,3是使用令牌(Oaut

    2024年02月08日
    浏览(41)
  • Spring Security OAuth2 远程命令执行漏洞

    cd vulhub/spring/CVE-2016-4977/ docker-compose up -d 访问 http://192.168.10.171:8080/oauth/authorize?response_type=${233*233}client_id=acmescope=openidredirect_uri=http://test 用admin:admin登陆 出现以下报错,表示漏洞存在(response_type里面的命令执行了) poc.py #!/usr/bin/env python message = input(‘Enter message to encode:’) p

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

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

    2024年02月09日
    浏览(57)
  • Spring Security对接OIDC(OAuth2)外部认证

    前后端分离项目对接OIDC(OAuth2)外部认证,认证服务器可以使用Keycloak。 后端已有用户管理和权限管理,需要外部认证服务器的用户名和业务系统的用户名一致才可以登录。 后台基于Spring Boot 2.7 + Spring Security 流程: 前台浏览器跳转到  后台地址 + /login/oauth2/authorization/my-oid

    2024年02月21日
    浏览(43)
  • SpringCloud微服务整合Spring Security OAuth2

    首先得了解什么是OAuth2,这个的话可以参见博客: https://blog.csdn.net/weixin_42272869/article/details/112260123 https://www.bilibili.com/video/BV1D94y1Z7t1?p=33vd_source=bf9d70f3d2a451db07f40b6407c95a77 本文采用的是使用最广泛的、安全性最高的 授权码模式 进行讲解。 单独创建一个鉴权微服务auth,负责整个

    2024年02月09日
    浏览(54)
  • Spring Security 源码解读:OAuth2 Authorization Server

    样例代码请参考:spring-security-oauth2.0-sample Spring Authorization Server刚发展不久,还没有springboot版本,而Resource Server有,但是两个底层很多不兼容,会重复引入不同版本的jar包。 另外,该 spring-security-oauth2-authorization-server 依赖支持OAuth2.1草案规范。 关于 OAuth2.1 草案介绍请参考

    2023年04月22日
    浏览(44)
  • Spring Security oauth2.0微信小程序登录

    微信小程序前期开发准备,可以参考这篇文章微信小程序前期准备 1、学习过Spring Secrity oauth2.0的都知道,他有四种登录模式可以选择 authorization code(授权码模式) implicit(简化模式) resource owner password credentials(密码模式) client credentials(客户端模式) 前三种模式都需要用

    2024年02月10日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包