Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展了多年了,但是使用的并不多,安全管理这个领域,一直是 Shiro 的天下。

相对于 Shiro,在 SSM/SSH 中整合 Spring Security 都是比较麻烦的操作,所以,Spring Security 虽然功能比 Shiro 强大,但是使用反而没有 Shiro 多(Shiro 虽然功能没有 Spring Security 多,但是对于大部分项目而言,Shiro 也够用了)。

自从有了 Spring Boot 之后,Spring Boot 对于 Spring Security 提供了 自动化配置方案,可以零配置使用 Spring Security。

因此,一般来说,常见的安全管理技术栈的组合是这样的:

  • SSM + Shiro
  • Spring Boot/Spring Cloud + Spring Security

注意,这只是一个推荐的组合而已,如果单纯从技术上来说,无论怎么组合,都是可以运行的。

我们来看下具体使用。

1.项目创建

在 Spring Boot 中使用 Spring Security 非常容易,引入依赖即可:

pom.xml 中的 Spring Security 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

只要加入依赖,项目的所有接口都会被自动保护起来。

2.初次体验

我们创建一个 HelloController:

@RestController
public class HelloController {@GetMapping("/hello")public String hello() {return "hello";}
}

访问 /hello ,需要登录之后才能访问。

当用户从浏览器发送请求访问 /hello 接口时,服务端会返回 302 响应码,让客户端重定向到 /login 页面,用户在 /login 页面登录,登陆成功之后,就会自动跳转到 /hello 接口。

另外,也可以使用 POSTMAN 来发送请求,使用 POSTMAN 发送请求时,可以将用户信息放在请求头中(这样可以避免重定向到登录页面):

通过以上两种不同的登录方式,可以看出,Spring Security 支持两种不同的认证方式:

  • 可以通过 form 表单来认证
  • 可以通过 HttpBasic 来认证

3.用户名配置

默认情况下,登录的用户名是 user ,密码则是项目启动时随机生成的字符串,可以从启动的控制台日志中看到默认密码:

这个随机生成的密码,每次启动时都会变。对登录的用户名/密码进行配置,有三种不同的方式:

  • 在 application.properties 中进行配置
  • 通过 Java 代码配置在内存中
  • 通过 Java 从数据库中加载

前两种比较简单,第三种代码量略大,本文就先来看看前两种,第三种后面再单独写文章介绍,也可以参考我的微人事项目。

3.1 配置文件配置用户名/密码

可以直接在 application.properties 文件中配置用户的基本信息:

spring.security.user.name=javaboy
spring.security.user.password=123

配置完成后,重启项目,就可以使用这里配置的用户名/密码登录了。

3.2 Java 配置用户名/密码

也可以在 Java 代码中配置用户名密码,首先需要我们创建一个 Spring Security 的配置类,集成自 WebSecurityConfigurerAdapter 类,如下:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {//下面这两行配置表示在内存中配置了两个用户auth.inMemoryAuthentication().withUser("javaboy").roles("admin").password("$2a$10$OR3VSksVAmCzc.7WeaRPR.t0wyCsIj24k0Bne8iKWV1o.V9wsP8Xe").and().withUser("lisi").roles("user").password("$2a$10$p1H8iWa8I4.CA.7Z8bwLjes91ZpY.rYREGHQEInNtAp4NzL6PLKxi");}@BeanPasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

这里我们在 configure 方法中配置了两个用户,用户的密码都是加密之后的字符串(明文是 123),从 Spring5 开始,强制要求密码要加密,如果非不想加密,可以使用一个过期的 PasswordEncoder 的实例 NoOpPasswordEncoder,但是不建议这么做,毕竟不安全。

Spring Security 中提供了 BCryptPasswordEncoder 密码编码工具,可以非常方便的实现密码的加密加盐,相同明文加密出来的结果总是不同,这样就不需要用户去额外保存的字段了,这一点比 Shiro 要方便很多。

4.登录配置

对于登录接口,登录成功后的响应,登录失败后的响应,我们都可以在 WebSecurityConfigurerAdapter 的实现类中进行配置。例如下面这样:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@AutowiredVerifyCodeFilter verifyCodeFilter;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.addFilterBefore(verifyCodeFilter, UsernamePasswordAuthenticationFilter.class);http.authorizeRequests()//开启登录配置.antMatchers("/hello").hasRole("admin")//表示访问 /hello 这个接口,需要具备 admin 这个角色.anyRequest().authenticated()//表示剩余的其他接口,登录之后就能访问.and().formLogin()//定义登录页面,未登录时,访问一个需要登录之后才能访问的接口,会自动跳转到该页面.loginPage("/login_p")//登录处理接口.loginProcessingUrl("/doLogin")//定义登录时,用户名的 key,默认为 username.usernameParameter("uname")//定义登录时,用户密码的 key,默认为 password.passwordParameter("passwd")//登录成功的处理器.successHandler(new AuthenticationSuccessHandler() {@Overridepublic void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException {resp.setContentType("application/json;charset=utf-8");PrintWriter out = resp.getWriter();out.write("success");out.flush();}}).failureHandler(new AuthenticationFailureHandler() {@Overridepublic void onAuthenticationFailure(HttpServletRequest req, HttpServletResponse resp, AuthenticationException exception) throws IOException, ServletException {resp.setContentType("application/json;charset=utf-8");PrintWriter out = resp.getWriter();out.write("fail");out.flush();}}).permitAll()//和表单登录相关的接口统统都直接通过.and().logout().logoutUrl("/logout").logoutSuccessHandler(new LogoutSuccessHandler() {@Overridepublic void onLogoutSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException {resp.setContentType("application/json;charset=utf-8");PrintWriter out = resp.getWriter();out.write("logout success");out.flush();}}).permitAll().and().httpBasic().and().csrf().disable();}
}

我们可以在 successHandler 方法中,配置登录成功的回调,如果是前后端分离开发的话,登录成功后返回 JSON 即可,同理,failureHandler 方法中配置登录失败的回调,logoutSuccessHandler 中则配置注销成功的回调。

5.忽略拦截

如果某一个请求地址不需要拦截的话,有两种方式实现:

  • 设置该地址匿名访问
  • 直接过滤掉该地址,即该地址不走 Spring Security 过滤器链

推荐使用第二种方案,配置如下:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overridepublic void configure(WebSecurity web) throws Exception {web.ignoring().antMatchers("/vercode");}
}

Spring Security 另外一个强大之处就是它可以结合 OAuth2 ,玩出更多的花样出来,这些我们在后面的文章中再和大家细细介绍。

本文就先说到这里,有问题欢迎留言讨论。

关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!

转载于:https://www.cnblogs.com/lenve/p/11242055.html

手把手带你入门 Spring Security!相关推荐

  1. BCrypt加密怎么存入数据库_松哥手把手带你入门 Spring Security,别再问密码怎么解密了...

    因为之前有小伙伴在松哥群里讨论如何给微人事的密码解密,我看到聊天记录后就惊呆了. 无论如何我也得写一篇文章,带大家入门 Spring Security!当我们在一个项目中引入 Spring Secur ...

  2. 松哥手把手带你入门 Spring Security,别再问密码怎么解密了

    文章目录 1.新建项目 2.用户配置 2.1 配置文件 2.2 配置类 2.2.1 为什么要加密 2.2.2 加密方案 2.2.3 PasswordEncoder 2.2.4 配置 3.自定义表单登录 ...

  3. RPA之家手把手带你入门Blue Prism教程系列3_如何新建用户和配置数据库

    RPA之家手把手带你入门Blue Prism 创建用户 第一步:寻找Security标签下的Users 第二步:配置Users 配置数据库 第一步:新建数据库 第二步:配置数据库 -本文章由RPA之家 ...

  4. linux 中国-新手村,从新手村开始,手把手带你入门梳理内核代码

    原标题:从新手村开始,手把手带你入门梳理内核代码 在上一期内容中,Java离Linux内核有多远? 我们介绍了从 JVM 到内核的编译原理,告诉大家应用和系统工程师如何接触到内核. 本文将 从一个简单 ...

  5. 手把手带你入门深度学习(一):保姆级Anaconda和PyTorch环境配置指南

    手把手带你入门深度学习(一):保姆级Anaconda和PyTorch环境配置指南 一. 前言和准备工作 1.1 python.anaconda和pytorch的关系 二. Anconda安装 2.1 ...

  6. RPA之家手把手带你入门Blue Prism教程系列4_认识Blue Prism的界面

    RPA之家手把手带你入门Blue Prism 1. Home & Analytics 2. Studio 2.1 Process 2.2 Object 2.3 Process与Object的关 ...

  7. RPA之家手把手带你入门Blue Prism教程系列7_深入了解Data Item

    RPA之家手把手带你入门Blue Prism 1. Data Item类型 2. Data Item的表现形式 2.1 Environment Variable(环境变量) 2.2 Session V ...

  8. RPA之家手把手带你入门Blue Prism教程系列 -汇总

    RPA之家手把手带你入门Blue Prism 基础篇 -本文章由RPA之家(rpazj.com)提供, 学习交流群QQ群465620839 微信交流群: 基础篇 RPA之家手把手带你入门Blue Pr ...

  9. RPA之家手把手带你入门Blue Prism教程系列1_如何申请Blue Prism免费试用版

    RPA之家手把手带你入门Blue Prism Blue Prism 免费试用版 第一步:申请一个BluePrism Portal账号 第二步:在DX网站申请一个测试license 第三步:申请成功后, ...

最新文章

  1. Glib实例学习(6)双端队列
  2. optee中关于异常向量表、中断等的深入思考
  3. wxWidgets:wxConfigBase类用法
  4. Oracle一个中文汉字占用几个字节
  5. Cacti使用配置及FAQ
  6. python文本进度条94页_Python学习笔记 | 实例4:文本进度条
  7. 实操教程丨如何将一个k3s集群集成到Gitlab项目中
  8. SharePoint2010 连接配置数据库字符串保存位置(转)
  9. Linux驱动程序中的并发控制
  10. python mysql 连接超时时间_一段时间后MySQL连接超时(Python、MySQL、FLASK)
  11. 公寓式楼房宜南北走向
  12. java中的关键字有哪些_java关键字有哪些?java关键字大全
  13. 【吐槽】Android 第一步,雀氏纸尿裤
  14. Android自定义圆角矩形图片ImageView
  15. enumerate的用法:
  16. Python4班平均成绩统计_郑州十一中2020届高考成绩简析(含新疆内高班)
  17. 嵌入式开发学习笔记9-做一个好玩的LED闪烁
  18. 面试官:策略模式和代理模式有什么区别?
  19. 利用Firesheep对人人网(renren.com)进行会话劫持.
  20. 美国全国就业普遍低迷“技术”就业却加速增长;爱立信发布2030年10大消费者趋势 | 美通社头条...

热门文章

  1. [管理心得] 稻盛和夫为日航危机出诊--人情营销的典型
  2. 组建Livebos超级快速开发平台学习研讨QQ群 !
  3. HTML中label的两种使用方法
  4. CSS3 @font-face 规则
  5. 2440裸机编程之四 外部中断
  6. 你真的会二分查找吗?
  7. Apache Spark学习:将Spark部署到Hadoop 2.2.0上
  8. golang中的strings.TrimPrefix
  9. redis源码客户端和服务端通信过程
  10. 父母已身作则,静待花开