Spring Boot2.0使用Spring Security的示例代码

一、Spring Secutity简介

Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。

对于上面提到的两种应用情景,Spring Security 框架都有很好的支持。在用户认证方面,Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。在用户授权方面,Spring Security 提供了基于角色的访问控制和访问控制列表(Access Control List,ACL),可以对应用中的领域对象进行细粒度的控制。

另外Spring Security也集成了OAuth2.0,接下来我们就介绍下这两种使用的,当然Spring Security还集成CAS等等,如果你要了解更多请查看 官方文档 ,我们下面的都是使用Spring Boot2.0做的demo,2.0以后已经集成了Spring Security5.0以上的版本;

二、Basic认证

这个也是我们经常使用的基于表单的认证,输入一个账号和密码点击登录这种,就是Basic认证,我们接下主要会讲一下使用以及5.0以后做了那些升级;

1.使用以及常用的一些参数的介绍

第一步使用Maven引入Spring Security jia包,这里我们使用Thymeleaf作为前端模板页面,这里也有一个地方可以探讨一波,为什么Spring MVC可以自由切换模板,这个地方我们找个机会一起探讨,这里先做下简单的介绍;

<dependencies>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
 </dependency>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
 </dependency>
 <!-- 前端模板 thymeleaf 依赖 -->
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
 </dependency>
 <!--安全认证框架-->
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
 </dependency>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
 </dependency>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
 </dependency>
 </dependencies>

第二步引入Java配置配置方案

这里我们先使用@Configuration和@EnableWebSecurity对Java类进行配置,接下来我们就是继承WebSecurityConfigurerAdapter,对里面的方法重写就可以了,分别是对AuthenticationManagerBuilder,WebSecurity,HttpSecurity方法,我们主要介绍AuthenticationManagerBuilder和HttpSecurity,通过对这两种方法重写最终实现我们自定义认证;

先来介绍一下HttpSecurity常用参数,如下图用法基本脱离不了下面这些方法,可以基于认证的方式有formLogin、openidLogin、oauth2Login,还可以做一些记住账号操作rememberMe,还可以进行session配置管理,还支持登出loginout等等,使用起来还是蛮简单的,大家可以参照一下这篇文章,还是蛮详细的;

接下来我们再看下AuthenticationManagerBuilder,我们重写这个方法,可以基于内存用户认证、数据库认证、LDAP认证、还可以自定义用户服务、还可以自己定义认证。这里我们使用自定义认证的做demo,另外这个大家还可能有一个困惑的点,configGlobal和configure的差别在哪里,这里大家可以 参考下这篇文章,Spring Security从3.2版本以后就默认开启了CRSF防护,这里是通过Token方式去检测的,在登陆的时候Thymeleaf模板会生成_csrf的标签来防止CRSF,对CSRF不懂的大家可以看下这篇文章 ,这个里面介绍一些防护CSRF的手段,大家可以思考下,我的demo只是一个简单的架子,为了是给大家介绍一些知识,可扩展大家根据这些介绍的知识可以随心所欲的扩展自己想要的,不要拘泥于一种方法;

最后我还要介绍一下加密的方式,Spring Security 4的时候我们常用的加密方式是MD5加盐的方式,5.0以后版本就找不到Md5PasswordEncoder,说明这个方法还是不够安全,还是可以通过暴力破解可以搞定,可能我不行但是拦不住一些高手,大家可以看下官方支持的以及弃用一些方法:

使用我就不介绍了,有兴趣可以自己探索一波,还可以参考一下 文章一 、文章二,下面我粘贴我的代码,讲到的这些可以扩展的地方大家我在代码中会标识清楚,喜欢动手可以尝试一下,我的重点是OAuth2验证;

/**
 *自定义认证
 * Created by wangt on 2018/7/29.
 */
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

 /**
 * http资源认证
 * @param http
 * @throws Exception
 */
 @Override
 protected void configure(HttpSecurity http) throws Exception {
 http.authorizeRequests()
  .antMatchers("/","/home").permitAll()
  .anyRequest().authenticated()
  .and()
  .formLogin()
  .loginPage("/login")
  .permitAll()
  .and()
  .logout()
  .permitAll();
 }

 /**
 * 自定义认证策略
 */
 @Autowired
 public void configGlobal(AuthenticationManagerBuilder auth) throws Exception {
 auth.authenticationProvider(authProvider()).eraseCredentials(true);
 }

 @Bean
 public AuthProvider authProvider(){
 return new AuthProvider();
 }
}

/**
 * 自定义认证
 * Created by wangt on 2018/8/18.
 */
public class AuthProvider implements AuthenticationProvider {
 private final BCryptPasswordEncoder bCryptPasswordEncoder=new BCryptPasswordEncoder();

 @Override
 public Authentication authenticate(Authentication authentication) throws AuthenticationException {
 String userName = authentication.getName();
 String inputPassword = (String) authentication.getCredentials();

 //如果你要使用thymeleaf认证方言可以扩展一下User
 //GrantedAuthority这个是使用方言的属性,有兴趣了解下
 //其实也就是通过这个使用if去判断
 User user =new User();
 user.setName("admin");
 user.setPassword("admin");
 if (user == null) {
  throw new AuthenticationCredentialsNotFoundException("authError");
 }

 //这一块可以自定义一些加密方式
 //自己动手实现一下
 if (true) {
  //这块有好几个构造
  //如果使用方言你可以使用3个参数的构造函数
  return new UsernamePasswordAuthenticationToken(user, null);

 }

 throw new BadCredentialsException("authError");
 }

 @Override
 public boolean supports(Class<?> aClass) {
 return true;
 }
}

/**
 * Created by wangt on 2018/8/18.
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

 //如果使用thymeleaf方言在这块扩展

 @Override
 public void addViewControllers(ViewControllerRegistry registry) {
 registry.addViewController("/index").setViewName("index");
 registry.addViewController("/").setViewName("index");
 registry.addViewController("/hello").setViewName("hello");
 registry.addViewController("/login").setViewName("login");
 }
}

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<!--主页面 index-->
您好!欢迎光临!
<a href="/login">登录</a>
<a href="/hello">限制访问的页面</a>
</body>
</html>

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<!--hello页面-->
hello
</body>
</html>

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<!--登录页面-->
<form th:action="@{/login}" method="post">
 <div><label> User Name : <input type="text" name="username"/> </label></div>
 <div><label> Password: <input type="password" name="password"/> </label></div>
 <div><input type="submit" value="登录"/></div>
</form>

</body>
</html>

/**
 * 登录控制器
 * Created by wangt on 2018/8/18.
 */
@Controller
public class LoginController {

 @GetMapping("/login")
 public String login(){
 return "/login";
 }

}

/**
 * 主页
 * Created by wangt on 2018/7/28.
 */
@Controller
public class HomeController {

 @GetMapping("/")
 public String index(){
  return "index";
 }
}

/**
 * hello页
 * Created by wangt on 2018/8/19.
 */
@Controller
public class HelloController {

 @GetMapping("/hello")
 public String index(){
 return "hello";
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot结合SpringSecurity实现图形验证码功能

    本文介绍了SpringBoot结合SpringSecurity实现图形验证码功能,分享给大家,具体如下: 生成图形验证码 根据随机数生成图片 将随机数存到Session中 将生成的图片写到接口的响应中 生成图形验证码的过程比较简单,和SpringSecurity也没有什么关系.所以就直接贴出代码了 根据随机数生成图片 /** * 生成图形验证码 * @param request * @return */ private ImageCode generate(ServletWebRequest r

  • SpringBoot与spring security的结合的示例

    权限控制,也是我们再日常开发中经常遇到的场景,需要根据用户的角色决定是否可以看到某个资源.目前,市面上此类框架主要有shiro与我们今天要讲到的spring security.关于权限的控制有复杂的控制,例如几乎每个公司都有单点登录系统,根据用户名来到数据库中拿到对应的权限,在展示该权限下能看到的资源.还有一种就是简单的控制,也就是我们今天所要提到的.将账号,密码,角色配置到代码中,也可以进行简单的控制,缺点不言而喻,扩展性不好,只有固定的账号,但是作为演示还是够用的. 好了废话不多说,上pom

  • Spring Boot(四)之使用JWT和Spring Security保护REST API

    通常情况下,把API直接暴露出去是风险很大的,不说别的,直接被机器攻击就喝一壶的.那么一般来说,对API要划分出一定的权限级别,然后做一个用户的鉴权,依据鉴权结果给予用户开放对应的API.目前,比较主流的方案有几种: 用户名和密码鉴权,使用Session保存用户鉴权结果. 使用OAuth进行鉴权(其实OAuth也是一种基于Token的鉴权,只是没有规定Token的生成方式) 自行采用Token进行鉴权 第一种就不介绍了,由于依赖Session来维护状态,也不太适合移动时代,新的项目就不要采用了.

  • 详解Spring Boot 使用Spring security 集成CAS

    1.创建工程 创建Maven工程:springboot-security-cas 2.加入依赖 创建工程后,打开pom.xml,在pom.xml中加入以下内容: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.3.RELEASE</versio

  • SpringBoot+Security 发送短信验证码的实现

    在core模块下properties包中创建SmsCodeProperties 在ValidateCodeProperties中new一个SmsCodeProperties对象,并实现getter.setter方法 在core模块下validate包中创建SmsCodeGenerator实现ValidateCodeGenerator接口 创建SmsCodeSender接口,定义发送短信的抽象方法 实现SmsCodeSender接口 在ValidateCodeBeanConfig中把SmsCode

  • SpringBoot + SpringSecurity 环境搭建的步骤

    一.使用SpringBoot+Maven搭建一个多模块项目(可以参考这篇文章 --> 这里) 二.删除父工程的src文件,删除app.browser.core下的.java文件 依赖关系: demo 依赖 browser browser.app依赖core 三.父工程pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache

  • Spring Boot如何使用Spring Security进行安全控制

    我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache Shiro.spring Security). 本文将具体介绍在Spring Boot中如何使用Spring Security进行安全控制. 准备工作 首先,构建一个简单的Web工程,以用于后续添加安全控制,也可以用之前Chapter3-1-2做为基础工程.若对如何使用Spring Boot构建We

  • Spring Boot整合Spring Security的示例代码

    本文讲述Spring Boot整合Spring Security在方法上使用注解实现权限控制,使用自定义UserDetailService,从MySQL中加载用户信息.使用Security自带的MD5加密,对用户密码进行加密.页面模板采用thymeleaf引擎. 源码地址:https://github.com/li5454yong/springboot-security.git 1.引入pom依赖 <parent> <groupId>org.springframework.boot

  • Spring Boot2.0使用Spring Security的示例代码

    一.Spring Secutity简介 Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案.一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分.用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统.用户认证一般要求用户提供用户名和密码.系统通过校验用户名和密码来完成认证过程.用户授权指的是

  • spring boot2.0图片上传至本地或服务器并配置虚拟路径的方法

    最近写了关于图片上传至本地文件夹或服务器,上传路径到数据库,并在上传时预览图片.使用到的工具如下: 框架:spring boot 2.0 前端模板:thymeleaf 图片预览:js 首先,上传以及预览,js以及<input type="file">,以及预览图片的JS function Img(obj){ var imgFile = obj.files[0]; console.log(imgFile); var img = new Image(); var fr = ne

  • 解决Spring boot2.0+配置拦截器拦截静态资源的问题

    第一次遇到这个问题的时候,简直是一脸蒙逼,写了一个拦截器以后,静态资源就不能访问了,到处查找才知道是版本问题 解决办法: 第一步:定义一个类实现 实现WebMvcConfigurer的类中拦截器中添加放行资源处添加静态资源文件路径: @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(sessionInterceptor).addPathPatterns("/&

  • Spring boot2.0 实现日志集成的方法(2)

    目录 前言: logback.xml配置文件定义 引用自定义logback.xml文件 附加说明 前言: 上一章Spring boot2.0 日志集成方法分享(1)讲解了spring boot日志简单集成,将所有的日志都输出到一个文件中,但是在实际的项目中,我们需要将日志进行分类,常规日志.异常日志.监控日志等,需要将日志输出到不同的文件中.spring boot 日志默认采用的是sf4j+logback实现,默认配置文件为logback-spring.xml,如果需要输出到不同的文件,需要自定

  • Spring boot2.0 日志集成方法分享(1)

    目录 前言: 1.基本引用 2.基础配置 3.基本使用 前言: 项目开发中日志是不可缺少的一部分,通过日志能够定位和分析事故原因.目前流行日志框架包含了log4j.log4j2.logback等,另外 slf4j(Simple Logging Facade for Java) 则是一个日志门面框架,提供了日志系统中常用的接口,logback 和 log4j 则对slf4j 进行了实现.本文将讲述spring boot 中如何使用logback+slf4j实现日志. Java应用中,日志一般分为以

  • Spring boot2.0 实现日志集成的方法(3)

    目录 前言 具体实现 定义日志注解 定义日志切面 基本使用 输出信息 总结 前言 上一章Spring boot2.0 实现日志集成的方法(2)主要讲解了将日志信息根据类别输出到不同的文件中,实际开发中我们需要通过日志来监控用户的操作行为.请求的耗时情况,针对耗时久的请求进行性能分析,提升系统性能. 具体实现 采用的Spring Aop切面技术来实现控用户的操作行为.请求的耗时情况. 定义日志注解 @Target({ ElementType.METHOD }) @Retention(Retenti

  • Spring Boot 实现Restful webservice服务端示例代码

    1.Spring Boot configurations application.yml spring: profiles: active: dev mvc: favicon: enabled: false datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/wit_neptune?createDatabaseIfNotExist=true&useUnicode=true&

  • Spring Boot加密配置文件特殊内容的示例代码详解

    有时安全不得不考虑,看看新闻泄漏风波事件就知道了我们在用Spring boot进行开发时,经常要配置很多外置参数ftp.数据库连接信息.支付信息等敏感隐私信息,如下 ​ 这不太好,特别是互联网应用,应该用加密的方式比较安全,有点类似一些应用如电商.公安.安检平台.滚动式大屏中奖信息等显示身份证号和手机号都是前几位4109128*********和158*******.那就把图中的明文改造下1. 引入加密包,可选,要是自己实现加解密算法,就不需要引入第三方加解密库 <dependency> &l

  • Spring BeanUtils忽略空值拷贝的方法示例代码

    目录 简介 获取null属性名(工具类) 示例 工具类 Entity Controller 测试 其他文件 其他网址 简介 说明 本文用示例介绍Spring(SpringBoot)如何使用BeanUtils拷贝对象属性(忽略空值). BeanUtils类所在的包 有两个包都提供了BeanUtils类: Spring的(推荐):org.springframework.beans.BeanUtilsApache的:org.apache.commons.beanutils.BeanUtils 忽略nu

  • Java spring boot 实现支付宝支付功能的示例代码

    一.准备工作: 1.登陆支付宝开发者中心,申请一个开发者账号. 地址:https://openhome.alipay.com/ 2.进入研发服务: 3.点击链接进入工具下载页面: 4.点击下载对应版本的RSA公钥生成器: 5.生成公钥密钥(记录你的应用私钥): 6.在支付宝配置公钥(点击保存): 二.搭建demo 1.引入jia包: <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alip

随机推荐