一、什么是Spring Security?

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,它是用于保护基于Spring的应用程序的实际标准。

Spring Security是一个框架,致力于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring Security的真正强大之处在于可以轻松扩展以满足自定义要求。

更多信息可以查看官网:https://spring.io/projects/spring-security

二、Spring Security的主要功能

  • 认证:验证用户名和密码是否合法(是否系统中用户)
  • 授权:是系统用户不代表你能使用某些功能,因为你可能没有权限
  • 防御会话固定,点击劫持,跨站点请求伪造等攻击
  • Servlet API集成
  • 与Spring Web MVC的可选集成

三、快速入门

新建一个SpringBoot的web项目spring-boot-security。

案例1:接口不添加保护

pom文件中不引入Spring Security,然后新建一个controller:

@RestController
public class AppController { @GetMapping("/hello")
public String hello() {
return "Hello,spring security!";
}
}

然后打开浏览器访问:http://localhost:8080/hello,成功后返回:

Hello,spring security!

案例2:接口添加保护

  1. pom文件添加依赖

pom文件中引入Spring Security的starter:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
  1. 访问接口

打开浏览器再次访问http://localhost:8080/hello,会被重定向到登录页http://localhost:8080/login,截图如下:

要登录系统,我们需要知道用户名和密码,Spring Security默认的用户名是user,项目启动的时候会生成默认密码(在启动日志中可以看到),输入用户名和密码后就可以访问/hello接口了。

当然也可以自定义用户名密码,在配置文件添加如下内容即可:

spring.security.user.name=java_suisui
spring.security.user.password=123456

四、自定义认证和授权

上面说过Spring Security的功能有“认证”和“授权”,下面通过一个简单的例子实现下自定义的认证和授权。

假设系统中有两个角色:

  • ADMIN 可以访问/admin下的资源
  • USER 可以访问/user下的资源

按照下面步骤操作即可。

  1. 新建一个配置类

对于用户名、密码、登录页面、访问权限等都可以在 WebSecurityConfigurerAdapter 的实现类中配置。

WebSecurityConfig代码如下:

/**
* 配置类
* @Author java_suisui
*
*/
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//配置内存中的 用户名、密码和角色
auth.inMemoryAuthentication().passwordEncoder(new MyPasswordEncoder()).withUser("user").password("123456").roles("USER");
auth.inMemoryAuthentication().passwordEncoder(new MyPasswordEncoder()).withUser("admin").password("123456").roles("ADMIN");
} @Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/user").hasRole("USER") //访问 /user这个接口,需要有USER角色
.antMatchers("/admin").hasRole("ADMIN")
.anyRequest().authenticated() //剩余的其他接口,登录之后就能访问
.and()
.formLogin().defaultSuccessUrl("/hello");
}
}
  1. 创建PasswordEncorder的实现类

内存用户验证时,Spring Boot 2.0以上版本引用的security 依赖是 spring security 5.X版本,此版本需要提供一个PasswordEncorder的实例。

MyPasswordEncoder代码如下:

public class MyPasswordEncoder implements PasswordEncoder {
@Override
public String encode(CharSequence rawPassword) {
return rawPassword.toString();
} @Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
return encodedPassword.equals(rawPassword);
}
}
  1. 登录验证

浏览器打开http://localhost:8080/login,

  • 使用user登录,可以访问/user
  • 使用admin登录,可以访问/admin

如果使用user登录后访问/admin,会报403错误,具体错误信息如下:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback. Tue Nov 19 16:26:28 CST 2019
There was an unexpected error (type=Forbidden, status=403).
Forbidden

结果和我们预期的一致,说明简单的自定义认证和授权功能已经实现了。

完整源码地址: https://github.com/suisui2019/springboot-study

推荐阅读

1.一分钟带你学会利用mybatis-generator自动生成代码!

2.手把手带你实战下Spring的七种事务传播行为

3.SpringBoot系列-整合Mybatis(注解方式)

4.SpringBoot系列-整合Mybatis(XML配置方式)

5.Java中打印日志,这4点很重要!


Java碎碎念,一个坚持原创的公众号,为您提供一系列系统架构、微服务、Java、SpringBoot、SpringCloud等高质量技术文章。

如果觉得文章不错,希望可以随手转发或者”在看“哦,非常感谢哈!

关注下方公众号后回复「1024」,有惊喜哦!

本文由博客一文多发平台 OpenWrite 发布!

一分钟带你了解下Spring Security!的更多相关文章

  1. 一分钟带你了解下MyBatis的动态SQL!

    MyBatis的强大特性之一便是它的动态SQL,以前拼接的时候需要注意的空格.列表最后的逗号等,现在都可以不用手动处理了,MyBatis采用功能强大的基于OGNL的表达式来实现,下面主要介绍下. 一. ...

  2. 手把手带你实战下Spring的七种事务传播行为

    目录 本文目录 一.什么是事务传播行为? 二.事务的7种传播行为 三.7种传播行为实战 本文介绍Spring的七种事务传播行为并通过代码演示下. 本文目录 一.什么是事务传播行为? 事务传播行为(pr ...

  3. 【项目实践】一文带你搞定Spring Security + JWT

    以项目驱动学习,以实践检验真知 前言 关于认证和授权,R之前已经写了两篇文章: [项目实践]在用安全框架前,我想先让你手撸一个登陆认证 [项目实践]一文带你搞定页面权限.按钮权限以及数据权限 在这两篇 ...

  4. spring boot 下 spring security 自定义登录配置与form-login属性详解

    package zhet.sprintBoot; import org.springframework.beans.factory.annotation.Autowired;import org.sp ...

  5. Spring Security笔记:登录尝试次数限制

    今天在前面一节的基础之上,再增加一点新内容,默认情况下Spring Security不会对登录错误的尝试次数做限制,也就是说允许暴力尝试,这显然不够安全,下面的内容将带着大家一起学习如何限制登录尝试次 ...

  6. spring security之httpSecurity使用示例

    如果在HttpSecurity中配置需要authenticate(),则如果没有登陆,或没有相关权限,则会无法访问 2017-01-02 23:39:32.027 DEBUG 10396 --- [n ...

  7. Spring Security Oauth2 的配置

    使用oauth2保护你的应用,可以分为简易的分为三个步骤 配置资源服务器 配置认证服务器 配置spring security 前两点是oauth2的主体内容,但前面我已经描述过了,spring sec ...

  8. spring boot 之 spring security 配置

    Spring Security简介 之前项目都是用shiro,但是时过境迁,spring security变得越来越流行.spring security的前身是Acegi, acegi 我也玩过,那都 ...

  9. Re:从零开始的Spring Security Oauth2(一)

    前言 今天来聊聊一个接口对接的场景,A厂家有一套HTTP接口需要提供给B厂家使用,由于是外网环境,所以需要有一套安全机制保障,这个时候oauth2就可以作为一个方案. 关于oauth2,其实是一个规范 ...

随机推荐

  1. Git上传到gitlab现有分支

    [场景]gitlab上已经创建了分支,将本地的文件上传到该分支下 gitlab上的现有分支branch_new 在需要上传的文件夹下打开git命令窗口 # 克隆远端分支到本地 git clone -b ...

  2. Vtable内存布局分析

    vtale 内存布局分析 虚函数表指针与虚函数表布局 考虑如下的 class: class A { public: int a; virtual void f1() {} virtual void f ...

  3. Spring Security 入门(一)

    当你看到这篇文章时,我猜你肯定是碰到令人苦恼的问题了,我希望本文能让你有所收获. 本人几个月前还是 Spring 小白,几个月走来,看了 Spring,Spring boot,到这次的 Spring ...

  4. oracle数据库的安全测试

    Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.它是在数据库领域一直处于领先地位的产品.可以说Oracle数据库系统是目前世界上 ...

  5. Angular/Vue多复选框勾选问题

    此页面效果以Angular实现,Vue也可按照其大致流程实现,其核心本质没有改变. 功能效果为:页面初始化效果为要有所有角色的复选框,要求初始化默认勾选的角色要显示勾选,之后,能按照最终勾选的状态提交 ...

  6. 05jmeter正则表达式

    1.必须掌握的正则字符 "^" :^会匹配行或者字符串的起始位置,有时还会匹配整个文档的起始位置."$" :$会匹配行或字符串的结尾."\w" ...

  7. vue入门笔记(新手入门必看)

    一.什么是Vue? 1.    vue为我们提供了构建用户界面的渐进式框架,让我们不再去操作dom元素,直接对数据进行操作,让程序员不再浪费时间和精力在操作dom元素上,解放了双手,程序员只需要关心业 ...

  8. 基于Opentracing+Jaeger全链路灰度调用链

    当网关和服务在实施全链路分布式灰度发布和路由时候,我们需要一款追踪系统来监控网关和服务走的是哪个灰度组,哪个灰度版本,哪个灰度区域,甚至监控从Http Header头部全程传递的灰度规则和路由策略.这 ...

  9. Spring自定义日志注解

    JDK1.5中引入注解,spring框架把java注解发扬光大 一  创建自定义注解 import java.lang.annotation.Retention; import java.lang.a ...

  10. react中使用redux简易案例讲解

    为什么我想要使用redux? 前段时间初步上手了react,最近在使用react的过程中发现对于组件之间通信的需求比较迫切,尤其是在axios异步请求后端数据的时候,这样的需求是特别强烈的!举个例子: ...