Java Spring Security认证与授权及注销和权限控制篇综合解析

 更新时间:2021年10月27日 09:21:17   作者:龍弟-idea  
Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展了多年了,但是使用的并不多,安全管理这个领域,一直是 Shiro 的天下

Spring Security简介:

Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,它可以实现强大的Web安全控制,对于安全控制,我们只需要引入 spring-boot-starter-security 模块,进行少量的配置,即可实现强大的安全管理!

记住几个类:

  • WebSecurityConfigurerAdapter:自定义Security策略
  • AuthenticationManagerBuilder:自定义认证策略
  • @EnableWebSecurity:开启WebSecurity模式

Spring Security的两个主要目标是 “认证” 和 “授权”(访问控制)。

“认证”(Authentication)

身份验证是关于验证您的凭据,如用户名/用户ID和密码,以验证您的身份。

身份验证通常通过用户名和密码完成,有时与身份验证因素结合使用。

“授权” (Authorization)

授权发生在系统成功验证您的身份后,最终会授予您访问资源(如信息,文件,数据库,资金,位置,几乎任何内容)的完全权限。

这个概念是通用的,而不是只在Spring Security 中存在。

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

下面是spring security官网:Spring Security 找到对应的官方文档:Spring Security Reference

实验环境搭建:

1.新建一个初始的springboot项目web模块,thymeleaf模块

2.导入静态资源

3、controller跳转!

4、测试实验环境是否成功

认证和授权

我们测试的环境,是谁都可以访问,现在我们使用 Spring Security 增加上认证和授权的功能

1、引入 Spring Security 模块

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

2、编写 Spring Security 配置类

参考对应的官方文档:Spring Security Reference

3、编写基础配置类

@EnableWebSecurity // 开启WebSecurity模式
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
   @Override
   protected void configure(HttpSecurity http) throws Exception {
       
  }
}

4.定义授权的规则:

在配置类中看授权的源码:

5、测试,发现除了首页都进不去了!因为我们目前没有登录的角色,因为请求需要登录的角色拥有对应的权限才可以!

6、在configure()方法中加入以下配置,开启自动配置的登录功能!

从源码解释中看

// 开启自动配置的登录功能
// /login 请求来到登录页
// /login?error 重定向到这里表示登录失败
http.formLogin();

7、测试一下:发现,没有权限的时候,会跳转到登录的页面!

8、查看刚才登录页的注释信息;

我们可以定义认证规则,从源码中查看

重写configure(AuthenticationManagerBuilder auth)方法

//定义认证规则
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
   
   //在内存中定义,也可以在jdbc中去拿....
   auth.inMemoryAuthentication()
          .withUser("kuangshen").password("123456").roles("vip2","vip3")
          .and()
          .withUser("root").password("123456").roles("vip1","vip2","vip3")
          .and()
          .withUser("guest").password("123456").roles("vip1","vip2");
}

9、测试,我们可以使用这些账号登录进行测试!发现会报错!

There is no PasswordEncoder mapped for the id “null”

10、原因,我们要将前端传过来的密码进行某种方式加密,否则就无法登录,修改代码

11、测试,登录成功,并且每个角色只能访问自己认证下的规则

权限控制和注销

1、开启自动配置的注销的功能

2、在前端,增加一个注销的按钮,index.html 导航栏中

<a class="item" th:href="@{/logout}" rel="external nofollow" >
   <i class="sign-out icon"></i> 注销
</a>

3、可以去测试一下,登录成功后点击注销,发现注销完毕会跳转到登录页面!

4、但是,我们想让他注销成功后,依旧可以跳转到首页,该怎么处理呢?

// .logoutSuccessUrl("/"); 注销成功来到首页
http.logout().logoutSuccessUrl("/");

5、测试,注销完毕后,发现跳转到首页OK

6、现在来一个需求:用户没有登录的时候,导航栏上只显示登录按钮,用户登录之后,导航栏可以显示登录的用户信息及注销按钮!还有就是,比如longdi这个用户,它只有 vip2,vip3功能,那么登录则只显示这两个功能,而vip1的功能菜单不显示!这个就是真实的网站情况了!

我们需要结合thymeleaf中的一些功能

sec:authorize="isAuthenticated()":是否认证登录!来显示不同的页面

Maven依赖:

<dependency>
   <groupId>org.thymeleaf.extras</groupId>
   <artifactId>thymeleaf-extras-springsecurity5</artifactId>
   <version>3.0.4.RELEASE</version>
</dependency>

7、修改我们的 前端页面

导入命名空间 xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"

修改导航栏,增加认证判断

8、重启测试,可以登录试试看,登录成功后确实,显示了我们想要的页面;

9、如果注销404了,就是因为它默认防止csrf跨站请求伪造,因为会产生安全问题,可以将请求改为post表单提交,或者在spring security中关闭csrf功能;试试在 配置中增加

10、继续将下面的角色功能块认证完成!测试成功!

到此这篇关于Java Spring Security认证与授权及注销和权限控制篇综合解析的文章就介绍到这了,更多相关Java Spring Security内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入探讨Java内存区域

    深入探讨Java内存区域

    本篇文章对Java内存区域的使用进行了详细的介绍,内容很全面,需要的朋友可以参考下
    2015-07-07
  • Spring和Mybatis整合的原理详解

    Spring和Mybatis整合的原理详解

    这篇文章主要介绍了Spring和Mybatis整合的原理详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • 浅谈Java内存泄露

    浅谈Java内存泄露

    内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。下面我们来一起了解如何解决
    2019-05-05
  • Java中while语句的简单知识及应用

    Java中while语句的简单知识及应用

    这篇文章主要给大家介绍了关于Java中while语句的简单知识及应用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 精致小巧的java相册制作方法

    精致小巧的java相册制作方法

    这篇文章主要为大家详细介绍了精致小巧的java相册制作方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Javaweb中Request获取表单数据的四种方法详解

    Javaweb中Request获取表单数据的四种方法详解

    本文主要介绍了Javaweb中Request获取表单数据的四种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Java 继承与多态超详细梳理

    Java 继承与多态超详细梳理

    继承就是可以直接使用前辈的属性和方法。自然界如果没有继承,那一切都是处于混沌状态。多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
    2022-04-04
  • maven多moudle项目在idea里面显示多个root问题及解决

    maven多moudle项目在idea里面显示多个root问题及解决

    这篇文章主要介绍了maven多moudle项目在idea里面显示多个root问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Windows系统编写bat脚本启动、停止及重启Java服务jar包

    Windows系统编写bat脚本启动、停止及重启Java服务jar包

    在bat文件中我们将编写一些代码来运行Java jar文件,下面这篇文章主要给大家介绍了关于Windows系统编写bat脚本启动、停止及重启Java服务jar包的相关资料,需要的朋友可以参考下
    2023-12-12
  • Java实现的百度语音识别功能示例

    Java实现的百度语音识别功能示例

    这篇文章主要介绍了Java实现的百度语音识别功能,较为简明扼要的分析了Java调用百度语音接口相关操作步骤,并给出了具体的语音识别用法代码示例,需要的朋友可以参考下
    2018-08-08

最新评论