在 Web 开发中,安全一直是非常重要的一个方面。

安全虽然属于应用的非功能性需求,但是从应用开发的第一天就应该把安全相关的因素考虑进来,并在整个应用的开发过程中。

Spring Security官网介绍

Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.

Spring Security is a framework that focuses on providing both authentication and authorization to Java applications. Like all Spring projects, the real power of Spring Security is found in how easily it can be extended to meet custom requirements

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

Spring Security是一个框架,侧重于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring安全性的真正强大之处在于它可以轻松地扩展以满足定制需求。

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

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

应用

------------恢复内容开始------------

在 Web 开发中,安全一直是非常重要的一个方面。

安全虽然属于应用的非功能性需求,但是从应用开发的第一天就应该把安全相关的因素考虑进来,并在整个应用的开发过程中。

Spring Security官网介绍

Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.

Spring Security is a framework that focuses on providing both authentication and authorization to Java applications. Like all Spring projects, the real power of Spring Security is found in how easily it can be extended to meet custom requirements

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

Spring Security是一个框架,侧重于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring安全性的真正强大之处在于它可以轻松地扩展以满足定制需求。

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

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

应用

添加依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5.  
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-test</artifactId>
  9. <scope>test</scope>
  10. </dependency>
  11.  
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-security</artifactId>
  15. </dependency>
  16.  
  17. <!--thymeleaf-->
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  21. </dependency>

编写一些具有层级关系的简单页面,方便后面的模拟访问:

为这些页面对应的写上控制层:

  1. package com.hwl.securitydemo.controller;
  2.  
  3. @Controller
  4. public class RouterController {
  5.  
  6. @RequestMapping({"/","/index"})
  7. public String index(){
  8. return "index";
  9. }
  10.  
  11. @RequestMapping("/toLogin")
  12. public String toLogin(){
  13. return "router/login";
  14. }
  15.  
  16. @RequestMapping("/level1/{id}")
  17. public String level1( @PathVariable("id") int id ){
  18. return "/router/level1/"+id;
  19. }
  20.  
  21. @RequestMapping("/level2/{id}")
  22. public String level2( @PathVariable("id") int id ){
  23. return "router/level2/"+id;
  24. }
  25.  
  26. @RequestMapping("/level3/{id}")
  27. public String level3( @PathVariable("id") int id ){
  28. return "router/level3/"+id;
  29. }
  30. }

关闭 thymeleaf 方便开发测试:

  1. spring.thymeleaf.cache=false

此时,测试运行项目,访问,进入到了Spring Security默认的登录页面,说明Security已经生效!

实际情况我们很少会使用默认的配置,所有这里也是通过定义自己的SecurityConfig来接管默认的配置:

  1. @EnableWebSecurity
  2. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  3. @Override
  4. protected void configure(HttpSecurity http) throws Exception {
  5.  
  6. //请求授权规则 首页人人都能访问 功能页有权限才可访问
  7. http.authorizeRequests().antMatchers("/").permitAll()
  8. .antMatchers("/level1/**").hasRole("VIP1")
  9. .antMatchers("/level2/**").hasRole("VIP2")
  10. .antMatchers("/level3/**").hasRole("VIP3");
  11.  
  12. //没有权限默认去登录页 需要开启登录的页面- /login
  13. http.formLogin();
  14.  
  15. }
  16.  
  17. @Override
  18. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  19. //正常情况应该从数据读取
  20. auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
  21. .withUser("guest").password(new BCryptPasswordEncoder().encode("123456")).roles("VIP1")
  22. .and()
  23. .withUser("me").password(new BCryptPasswordEncoder().encode("123456")).roles("VIP2", "VIP3")
  24. .and()
  25. .withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("VIP1", "VIP2", "VIP3");
  26. }
  27. }

这个配置里,我们开放了默认页面,并设置3个VIP等级分别对应3个level组的访问权限,之后再模拟三个真实角色,分别为他们授权,例如me这个真实角色具有VIP2、VIP3这两个等级,对应的具有了level2、level3的访问权限。

注意:这里在实际项目中是用来自数据库的数据,这里为了更快更方便的测试,直接写数据模拟。

现在测试访问:

正在进入主页,测试访问任意一个功能链接:

因为没有登录过,被security拦截送去了默认的登录页面了。

现在登录me这个真实角色,正常返回具有权限后的主页,访问me具有的level2、level3下的功能:

level2、level3成功访问到,现在测试me这个角色没访问权限的level1下的菜单:

没有访问到,返回了Error Page,这基本就完成了登录和访问拦截了。

现在虽然实现了角色的权限访问控制,但是还有优化空间,就是让没有权限的项目直接不让角色看到:

导入thymeleaf-springsecurity整合包

  1. <dependency>
  2. <groupId>org.thymeleaf.extras</groupId>
  3. <artifactId>thymeleaf-extras-springsecurity4</artifactId>
  4. <version>3.0.4.RELEASE</version>
  5. </dependency>

页面添加命名空间

  1. xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"

在页面上添加角色判断:

sec:authorize="hasRole('VIP1')"

  1. <div class="col-md-3" sec:authorize="hasRole('VIP1')" >
  2. <p>
  3. L1
  4. </p>
  5. <p>
  6. <a th:href="@{/level1/1}"><li class="bullhorn icon"></li>Level-1-1</a>
  7. </p>
  8. <p>
  9. <a th:href="@{/level1/2}"><li class="bullhorn icon"></li>Level-1-2</a>
  10. </p>
  11. <p>
  12. <a th:href="@{/level1/3}"><li class="bullhorn icon"></li>Level-1-3</a>
  13. </p>
  14. </div>

VIP2、VIP3相同。

注销:

页面添加对应的:

  1. <a class="item" th:href="@{/logout}">
  2. <i class="glyphicon glyphicon-log-out"></i> 注销
  3. </a>

在SecurityConfig中 configure(HttpSecurity http) 添加

  1. // 处理请求方式问题
  2. http.csrf().disable();
  3. //注销
  4. http.logout().logoutSuccessUrl("/");

因为页面这样的请求方式是get,所需要 http.csrf().disable();

此时从主页注销后,可以发现再次去点击功能的时候已经没有使用权限了,被送回了登录页面,注销能用。

SpringBoot-集成SpringSecurity的更多相关文章

  1. SpringBoot 集成SpringSecurity JWT

    目录 1. 简介 1.1 SpringSecurity 1.2 OAuth2 1.3 JWT 2. SpringBoot 集成 SpringSecurity 2.1 导入Spring Security ...

  2. 【使用篇二】SpringBoot集成SpringSecurity(22)

    SpringSecurity是专门针对基于Spring项目的安全框架,充分利用了依赖注入和AOP来实现安全管控.在很多大型企业级系统中权限是最核心的部分,一个系统的好与坏全都在于权限管控是否灵活,是否 ...

  3. Springboot集成SpringSecurity

    一.Spring security 是什么? Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架. 它提供了一组可以在Spring应用上 ...

  4. SpringBoot集成Spring Security(5)——权限控制

    在第一篇中,我们说过,用户<–>角色<–>权限三层中,暂时不考虑权限,在这一篇,是时候把它完成了. 为了方便演示,这里的权限只是对角色赋予权限,也就是说同一个角色的用户,权限是 ...

  5. SpringBoot集成Spring Security(4)——自定义表单登录

    通过前面三篇文章,你应该大致了解了 Spring Security 的流程.你应该发现了,真正的 login 请求是由 Spring Security 帮我们处理的,那么我们如何实现自定义表单登录呢, ...

  6. 【springBoot】springBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

  7. SpringBoot集成security

    本文就SpringBoot集成Security的使用步骤做出解释说明.

  8. springboot集成Actuator

    Actuator监控端点,主要用来监控与管理. 原生端点主要分为三大类:应用配置类.度量指标类.操作控制类. 应用配置类:获取应用程序中加载的配置.环境变量.自动化配置报告等与SpringBoot应用 ...

  9. SpringBoot集成Shiro并用MongoDB做Session存储

    之前项目鉴权一直使用的Shiro,那是在Spring MVC里面使用的比较多,而且都是用XML来配置,用Shiro来做权限控制相对比较简单而且成熟,而且我一直都把Shiro的session放在mong ...

  10. SpringBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

随机推荐

  1. git所遇到的问题

    出现这种情况,或 ERROR: Repository not found. fatal: 无法读取远程仓库. 解决办法如下: 1.先输入$ git remote rm origin(删除关联的orig ...

  2. rasa 如何写一个故事

    设计故事 在设计故事时,需要考虑两组对话交互:快乐路径和不快乐路径.快乐路径描述用户何时按照您的预期遵循对话流程,并在出现提示时始终提供必要的信息.然而,用户经常会因为问题.闲聊或其他问题而偏离愉快的 ...

  3. 【Office Excel】vlookup函数的反向查找实例教程,不只是正向查找,还可以反向查找,实例讲解

    VLOOKUP 反向查询 众所周知,vlookup只能从左向右查找,而不能从右至左的反向查找.为此高手们设计了一个让无数新手迷惑的公式.今天优爱酷将彻底帮同学们解开这个迷团. [例]如下图所示要求根据 ...

  4. nginx 开启,关闭,重启

    2021-08-191. 启动 # 判断配置文件是否正确 cd /usr/local/nginx/sbin ./nginx -t # 启动 cd usr/local/nginx/sbin ./ngin ...

  5. Servlet学习笔记(三)之HttpServletRequest

    HttpServletRequest(HttpServletRequest 想比 ServletRequest 添加与协议相关 API)对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HT ...

  6. vue 引用省市区三级联动(插件)

    vue 用省市区三级联动之傻瓜式教程(复制粘贴即用) npm 下载 npm install v-distpicker --save main.js //引入 省市区三级联动 import Distpi ...

  7. [考试总结]noip模拟42

    开始给了一个简单的题目,但我还是没有珍惜. 一个简简单单的树形 \(dp\),然而因为取模却不知道该如何比较大小.. 其实可以取 \(log\),然后我就梦中惊坐起,然后想到了魔法少女lbw 淦 然后 ...

  8. Python - 面向对象编程 - __str__()

    为什么要讲 __str__ 在 Python 中,直接 print 一个实例对象,默认是输出这个对象由哪个类创建的对象,以及在内存中的地址(十六进制表示) 假设在开发调试过程中,希望使用 print ...

  9. python3 爬虫五大模块之二:URL管理器

    Python的爬虫框架主要可以分为以下五个部分: 爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义: URL管理器:负责URL的管理,包括 ...

  10. 【曹工杂谈】Maven IOC容器的下半场:Google Guice

    Maven容器的下半场:Guice 前言 在前面的文章里,Maven底层容器Plexus Container的前世今生,一代芳华终落幕,我们提到,在Plexus Container退任后,取而代之的底 ...