Spring Security 是一个强大且高度可定制的身份验证和访问控制框架,完全基于 Spring 的应用程序的标准,Spring Security 为基于 Java EE 的企业应用程序提供了一个全面的安全解决方案。

安全框架最主要包括两个操作

  • 认证(Authentication) 确认用户可以访问当前系统
  • 授权(Authorization) 确定用户在当前系统中是否能够执行某个操作,即用户所拥有的功能权限。

Spring Security 适配器

在 Spring Boot 当中配置 Spring Security 非常简单,创建一个自定义类继承 WebSecurityConfigurerAdapter,并在该类中使用 @EnableWebSecurity注解,就可以通过重写 config 方法来配置所需要的安全配置。

WebSecurityConfigurerAdapter 是 Spring Security 为 web 应用提供的一个适配器,实现了 WebSecurityConfigurer 接口,提供了两个方法用于重写开发者需要的安全配置。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {} @Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {} }

configure(HttpSecurity http) 方法中可以通过 HttpSecurityauthorizeRequests() 方法定义哪些 URL 需要被保护,哪些不需要被保护;通过 formLogin() 方法定义当前用户登录的时候,跳转到的登录界面。

configure(AuthenticationManagerBuilder auth) 方法用于创建用户和用户的角色。

用户认证

Spring Security 是通过在 configure(AuthenticationManagerBuilder auth) 完成用户认证的。使用 AuthenticationManagerBuilderinMemoryAuthentication() 方法可以向内存中添加用户,并给用户指定权限。

	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
super.configure(auth);
// 在内存中添加用用户,并给用户指定角色权限
auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN","DBA");
auth.inMemoryAuthentication().withUser("yang").password("123456").roles("USER");
}

上边的代码中添加了两个用户,其中一个用户名是 yang 密码是 123456 用户权限是 USER ; 另一个用户名是 admin 密码是 admin 用户权限是两个 ADMIN DBA 。 需要注意的是 Spring Security 保存用户权限的时候,会默认使用 ROLE_ ,也就是说, USER 实际上是 ROLE_USER, ADMIN 是 ROLE_ADMIN ,DBA 实际上是 ROLE_DBA

当然,也可以查询数据库获取用户和权限。

用户授权

Spring Security 是通过 configure(HttpSecurity http) 完成用户授权。

    @Override
protected void configure(HttpSecurity http) throws Exception {
http
//// 开始请求权限配置
.authorizeRequests()
// 我们指定任何用户都可以访问多个URL的模式。
// 任何用户都可以访问以"/resources/","/signup", 或者 "/about"开头的URL。
.antMatchers("/assets/**","/").permitAll()
// 请求匹配 /admin/** 只拥有 ROLE_ADMIN 角色的用户可以访问
.antMatchers("/yang/**").hasRole("ADMIN")
// 请求匹配 /user/** 拥有 ROLE_ADMIN 和 ROLE_USER 的角色用户都可以访问
.antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
// 任何以"/db/" 开头的URL需要同时具有 "ROLE_ADMIN" 和 "ROLE_DBA"权限的用户才可以访问。
// 和上面一样我们的 hasRole 方法也没有使用 "ROLE_" 前缀。
// .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
// 其余所有的请求都需要认证后才可以访问
.anyRequest().authenticated(); http
.formLogin()
// 登陆界面;默认登陆成功后的界面(不起作用);默认登陆失败的界面;表单提交地址
.loginPage("/login.html")
.loginProcessingUrl("/login")
.failureUrl("/login.html?error")
.permitAll()
.and()
.rememberMe()
.tokenValiditySeconds(1209600)
.key("rememberme")
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login.html")
.permitAll(); http
.formLogin().defaultSuccessUrl("/index.html"); }

Spring Boot 的 Security 安全控制的更多相关文章

  1. spring boot之security

    上一节的时候,我们打开了springboot的端点,有一些数据是非常敏感的,比如/shutdown. 这一节,我们要给一些敏感信息加上权限控制. spring boot本身的security模块就很好 ...

  2. spring boot + thymeleaf +security自定义规则 的简单使用

    1.前言 以前开发一直使用 springMVC模式开发 ,前端页面常使用 JSP  ,现在html5淘汰了 ,要么使用html ,要么使用vue , 现在使用spring boot ,有必要总结一下 ...

  3. Spring Boot 配置 Security 密码加密

    依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spri ...

  4. Spring Boot Security配置教程

    1.简介 在本文中,我们将了解Spring Boot对spring Security的支持. 简而言之,我们将专注于默认Security配置以及如何在需要时禁用或自定义它. 2.默认Security设 ...

  5. 一键式Spring集成工具 Spring Boot

    最近公司使用Spring boot进行开发,稍微了解一下,不过自我感觉把集中式配置applicate.properties搞明白,注解用过Spring MVC的boot绝对没问题的 比如拦截器:@As ...

  6. Spring Boot开发之流水无情(二)

    http://my.oschina.net/u/1027043/blog/406558 上篇散仙写了一个很简单的入门级的Spring Boot的例子,没啥技术含量,不过,其实学任何东西只要找到第一个突 ...

  7. Spring Boot中使用Spring Security进行安全控制

    我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache ...

  8. Spring Boot教程(二十六)使用Spring Security安全控制

    准备工作 首先,构建一个简单的Web工程,以用于后续添加安全控制,也可以用之前Chapter3-1-2做为基础工程.若对如何使用Spring Boot构建Web应用,可以先阅读<Spring B ...

  9. Spring Boot中使用 Spring Security 构建权限系统

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,为应用系统提供声明式的安全 ...

随机推荐

  1. tcp/ip通信中tcp头部结构tcphdrp->check校验计算

    通过raw socket修改通信数据后,可通过函数 set_tcp_checksum1(iph); 重新校验计算iph->check值 在http://www.cnblogs.com/dpf-1 ...

  2. JVM学习记录-类加载器

    前言 JVM设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外面去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类 ...

  3. laravel的seeder数据填充

    1.简介//Laravel 包含了一个简单方法来填充数据库——使用填充类和测试数据.所有的填充类都位于database/seeds目录.//填充类的类名完全由你自定义,但最好还是遵循一定的规则,比如可 ...

  4. Quartz2D指定显示范围

    在qq中,可以看到头像是圆形显示的,通过CGContextClip可以设置 CGContextRef context=UIGraphicsGetCurrentContext(); CGContextA ...

  5. .18-浅析webpack源码之compile流程-rules参数处理(1)

    Tips:写到这里,需要对当初的规则进行修改.在必要的地方,会在webpack.config.js中设置特殊的参数来跑源码,例如本例会使用module:{rules:[...]}来测试,基本上测试参数 ...

  6. C#获取gif帧数

    C#获取gif帧数 /// <summary> /// 获取gif帧数 /// </summary> /// <param name="gifBytes&quo ...

  7. 自定义一个可以动态折叠的UITAbleViewCell

    看到code 4APP上有一个折叠的UITAbleViewCell,不过是swift的,所以自己尝试做一个简单的可折叠的UITAbleViewCell 主要实现一个可以折叠的UITAbleViewCe ...

  8. HUD6182

    A Math Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. DOM(JavaScript高程笔记)

    一.节点层次 1.Node类型 if (someNode.nodeType == 1){ // 适用于所有浏览器 alert("Node is an element."); } N ...

  10. js之面向对象

    本文的面向对象分为ES6和ES6之前的,重点学习ES6的===============================一.面向对象 1.什么是面向对象 a)什么是对象:万物都可以抽象成对象 时间对象 ...