简介
在 Web 开发中,安全一直是非常重要的一个方面。
安全虽然属于应用的非功能性需求,但是应该在应用开发的初期就考虑进来。
市面上存在比较有名的:Shiro,Spring Security !
首先我们看下它的官网介绍:Spring Security官网地址
1 | vbnet复制代码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 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。
一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分,Spring Security 框架都有很好的支持。
1 | 复制代码在用户认证方面,Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。在用户授权方面, |
实战环境搭建
项目代码地址:gitee.com/zwtgit/spri…
1、新建一个初始的springboot项目web模块,thymeleaf模块
2、导入静态资源,资源上面有
3、controller跳转!
1 | java复制代码@Controller |
4、测试实验环境是否OK!
SpringSecurity
Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,
他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入 spring-boot-starter-security 模块,进行少量的配置,即可实现强大的安全管理!
记住几个类:
- WebSecurityConfigurerAdapter:自定义Security策略
- AuthenticationManagerBuilder:自定义认证策略
- @EnableWebSecurity:开启WebSecurity模式
Spring Security的两个主要目标是 “认证” 和 “授权”(访问控制)。
“认证”(Authentication)
身份验证是关于验证您的凭据,如用户名/用户ID和密码,以验证您的身份。
身份验证通常通过用户名和密码完成,有时与身份验证因素结合使用。
“授权” (Authorization)
授权发生在系统成功验证您的身份后,最终会授予您访问资源(如信息,文件,数据库,资金,位置,几乎任何内容)的完全权限。
这个概念是通用的,而不是只在Spring Security 中存在。
认证和授权
1、引入 Spring Security 模块
1 | java复制代码<dependency> |
2、编写 Spring Security 配置类
查看我们自己项目中的版本,找到对应的帮助文档:
docs.spring.io/spring-secu… #servlet-applications 8.16.4
3、编写基础配置类
1 | java复制代码@EnableWebSecurity // 开启WebSecurity模式 |
4、定制请求的授权规则
1 | java复制代码@Override |
5、测试一下:发现除了首页都进不去了!因为我们目前没有登录的角色,因为请求需要登录的角色拥有对应的权限才可以!
6、在configure()方法中加入以下配置,开启自动配置的登录功能!
1 | java复制代码// 开启自动配置的登录功能 |
7、测试一下:发现,没有权限的时候,会跳转到登录的页面!
8、查看刚才登录页的注释信息;
我们可以定义认证规则,重写configure(AuthenticationManagerBuilder auth)方法
1 | java复制代码//定义认证规则 |
9、测试,我们可以使用这些账号登录进行测试!发现会报错!
There is no PasswordEncoder mapped for the id “null”
10、原因,我们要将前端传过来的密码进行某种方式加密,否则就无法登录,修改代码
1 | java复制代码//定义认证规则 |
11、测试,发现,登录成功,并且每个角色只能访问自己认证下的规则!
权限控制和注销
1、开启自动配置的注销的功能
1 | java复制代码//定制请求的授权规则 |
2、我们在前端,增加一个注销的按钮,index.html 导航栏中
3、我们可以去测试一下,登录成功后点击注销,发现注销完毕会跳转到登录页面!
4、但是,我们想让他注销成功后,依旧可以跳转到首页,该怎么处理呢?
1 | java复制代码// .logoutSuccessUrl("/"); 注销成功来到首页 |
5、测试,注销完毕后,发现跳转到首页OK
6、我们现在又来一个需求:根据权限访问页面
我们需要结合thymeleaf中的一些功能
sec:authorize=”isAuthenticated()”:是否认证登录!来显示不同的页面
Maven依赖:
1 | java复制代码<!-- https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity4 --> |
7、修改我们的 前端页面
- 导入命名空间
8、重启测试,我们可以登录试试看,登录成功后确实,显示了我们想要的页面;
9、如果注销404了,就是因为它默认防止csrf跨站请求伪造,因为会产生安全问题,我们可以将请求改为post表单提交,或者在spring security中关闭csrf功能;
1 | java复制代码http.csrf().disable();//关闭csrf功能:跨站请求伪造,默认只能通过post方式提交logout请求 |
权限控制和注销搞定!
记住我
1、开启记住我功能
1 | java复制代码//定制请求的授权规则 |
原理: spring security 登录成功后,将cookie发送给浏览器保存,
以后登录带上这个cookie,只要通过检查就可以免登录了。
如果点击注销,则会删除这个cookie,具体的原理在JavaWeb阶段都讲过了,这里就不在多说了!
Shiro
Apache Shiro是一个Java的安全(权限)框架。
Shiro可以完成,认证,授权,加密,会话管理,Web集成,缓存等。
三大核心组件
Shiro有三大核心组件,即Subject、SecurityManager和Realm
组件 | ||
---|---|---|
Subject | 用户,认证主体 | 应用代码直接交互的对象是Subject,Subject。包含Principals和Credentials两个信息 |
SecurityManager | 管理所有用户,为安全管理员。 | 是Shiro架构的核心。与Subject的所有交互都会委托给SecurityManager, Subject相当于是一个门面,而SecurityManager才是真正的执行者。它负责与Shiro 的其他组件进行交互。 |
Realm | 连接数据,是一个域。 | 可以把Realm看成DataSource,即安全数据源。 |
Pricipals:代表身份。可以是用户名、邮件、手机号码等等,用来标识一个登陆主题的身份。
Credentials:代表凭证。常见的有密码、数字证书等等。
在官网的例子中了解Shiro
1 | java复制代码public class Quickstart { |
快速上手
导入依赖
1 | xml复制代码 <!--shiro--> |
编写shiro配置类
1 | java复制代码@Configuration |
自定义Realm
1 | java复制代码//自定义Realm 需要继承AuthorizingRealm |
继续编写shiro配置类
1 | java复制代码@Configuration |
实现登录拦截
1 | java复制代码//ShiroFilterFactoryBean 第三步 |
用户认证
1 | java复制代码 //用户登录功能 |
shiro整合mybais
导入依赖
1 | xml复制代码 <!--spring boot整合mybatis--> |
编写配置
1 | yml复制代码spring: |
编写实体类,编写接口,编写映射文件
修改自定义Realm代码
1 | java复制代码 @Autowired |
请求授权
编写Shiro过滤器
1.设置访问/user/add
路径时,需要[user:add
权限
2.没有此权限访问时,会跳转指定路径
1 | java复制代码 //ShiroFilterFactoryBean 第三步 |
授权:
1 | java复制代码 //授权 |
本文转载自: 掘金