Spring Security

今天从以下几个内容介绍:

  1. Spring Security简介
  2. Spring Security的Maven依赖
  3. Spring Security使用

Spring Security简介

  • Spring Security是 Spring提供的安全认证服务的框架。 使用Spring Security可以帮助我们来简化认证和授权的过程。
  • 官网:https://projects.spring.io/spring-security/

Spring Security的Maven依赖

如果想使用最新版本的直接搜索:maven Spring Security

<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId><version>5.0.5.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>5.0.5.RELEASE</version>
</dependency>

Spring Security使用

  1. 导入依赖(上面已经写过了)

  2. 创建一个Web项目,在web.xml文件中配置一个过滤器:

</filter><!--DelegatingFilterProxy用于整合第三方框架整合Spring Security时过滤器的名称必须为springSecurityFilterChain,否则会抛出NoSuchBeanDefinitionException异常--><filter><filter-name>springSecurityFilterChain</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping><filter-name>springSecurityFilterChain</filter-name><url-pattern>/*</url-pattern></filter-mapping>
  1. 在配置文件目录下,添加一个spring-security配置文件,配置下面的内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:security="http://www.springframework.org/schema/security"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd"><!--配置不拦截的请求--><security:http security="none" pattern="/css/**"/><security:http security="none" pattern="/img/**"/><security:http security="none" pattern="/js/**"/><security:http security="none" pattern="/plugins/**"/><security:http auto-config="true" use-expressions="true"><!--配置在页面中的iframe标签默认不拦截--><security:headers><security:frame-options policy="SAMEORIGIN"/></security:headers><!--配置当访问/pages目录下的所有文件时,需要登录成功才能访问--><security:intercept-url pattern="/pages/**" access="isAuthenticated()"/><!--配置自定义的登录页面,如果不自定义,框架会有一个不太美观的登录页面login-page:自定义登录页面login-processing-url:定义的提交登录请求authentication-failure-url:登录失败返回的页面--><security:form-login login-page="/login.html"username-parameter="username"password-parameter="password"login-processing-url="/login"default-target-url="/pages/main.html"always-use-default-target="true"authentication-failure-url="/login.html"/><!--csrf:对应CsrfFilter过滤器disabled:是否启用CsrfFilter过滤器,如果使用自定义登录页面需要关闭此项,否则登录操作会被禁用(403)--><security:csrf disabled="true"/><!--配置登出页面 invalidate-session指定清除登录用户的session信息--><security:logout logout-url="/logout"logout-success-url="/hello.html"invalidate-session="true"/></security:http><!--配置密码加密对象--><bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/><!--认证管理器,用于处理认证操作--><security:authentication-manager><!--认证提供者,执行具体的认证逻辑springSecurityService这是我们自定义的类用来实现UserDetailsService接口 --><security:authentication-provider user-service-ref="springSecurityService"><!--指定密码加密策略--><security:password-encoder ref="passwordEncoder"/></security:authentication-provider></security:authentication-manager><!--开启注解方式权限控制--><security:global-method-security pre-post-annotations="enabled"/></beans>
         最后记得在springmvc的配置文件中导入这个文件
<import resource="spring-security.xml"/>
  1. 自己定义的类实现UserDetailsService,重写loadUserByUsername方法,返回一个User对象,将用户拥有的权限封装到这个对象中,最后在控制层中添加一个注解来让框架生效。
package com.ysdn.sercurity;import com.alibaba.dubbo.config.annotation.Reference;
import com.ysdn.bean.Permission;
import com.ysdn.bean.Role;
import com.ysdn.bean.User;
import com.ysdn.service.UserService;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;
import java.util.Set;@Service
public class SpringSecurityService implements UserDetailsService {@Reference(url = "dubbo://localhost:20887")private UserService userService;@Override//username参数是登录后框架封装传过来的public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user =  userService.findByName(username);if (user == null) {return null;}List<GrantedAuthority> list = new ArrayList<>();Set<Role> roles = user.getRoles();for (Role role : roles) {list.add(new SimpleGrantedAuthority(role.getKeyword()));Set<Permission> permissions = role.getPermissions();for (Permission permission : permissions) {list.add(new SimpleGrantedAuthority(permission.getKeyword()));}}return new org.springframework.security.core.userdetails.User(username, user.getPassword(), list);}
}

控制层代码:

//这就是Spring Security框架提供的注解@PreAuthorize("hasAuthority('CHECKITEM_DELETE')")@RequestMapping("deleteCheckItem")public Result deleteCheckItem(Integer id) {try {if (checkItemService.findCheckGroupId(id)) {return new Result(false, "已经注册到检查组中,不可删除");} else checkItemService.deleteCheckItem(id);} catch (Exception e) {e.printStackTrace();return new Result(false, MessageConstant.DELETE_CHECKITEM_FAIL);}return new Result(true, MessageConstant.DELETE_CHECKITEM_SUCCESS);}

在页面发送请求的地方弹出提示消息:

               //提示权限不足showAuthorityMessage(r) {if (r == 'Error: Request failed with status code 403') {this.$message.error("无权进行此操作");return;} else {this.$message.error("未知错误");return;}},// 删除handleDelete(row) {this.$confirm("您是否要删除这个检查项", "提示", {type: 'warning'}).then(() => {axios.post("/checkitem/deleteCheckItem?id=" + row.id).then((result) => {if (result.data.flag) {this.$message({type: "success",message: result.data.message});} else {this.$message.error(result.data.message);}this.findPage();}).catch((r) => {//在这里调用上面的方法this.showAuthorityMessage(r);});});}
  1. 测试,查看结果。
  2. 显示用户名
  • 向后台发出异步请求获取当前登录用户的用户名,显示到页面上。
//利用Vue的钩子函数,在每次初始化页面的时候显示用户名
created() {axios.post("/user/getUsername").then((result) => {if (result.data.flag) {//username用来显示在页面上this.username = result.data.data;}});}
  • 后台代码
package com.ysdn.controller;import com.ysdn.entity.MessageConstant;
import com.ysdn.entity.Result;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/getUsername")public Result getUsername() {//这是框架的提供的类SecurityContextHolder,里面存储着登录用户的信息拥有的权限User principal = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();String username = principal.getUsername();if (username != null) {return new Result(true, MessageConstant.GET_USERNAME_SUCCESS, username);}return new Result(false, MessageConstant.GET_USERNAME_FAIL);}
}

  1. 登出
  • Spring Security框架会自动处理登出,可以不用配置,这是中文官网的说明。
  • 只需要在页面配置一个请求路径就可以。

/logout

<spanstyle="display:block;"><a href="/logout">退出</a></span>
  • 也可以自己配置登出和相关的操作,如下的配置登出之后就会跳到hello.html页面。
<!--配置登出相关的信息 invalidate-session指定清除登录用户的session信息--><security:logout logout-url="/logout"logout-success-url="/hello.html"invalidate-session="true"/>

以上就是全部内容了,如果有不恰当的地方,欢迎指正。

安全框架Spring Security(认证和授权)相关推荐

  1. Spring Security 认证与授权(二)

    让 Spring Security 适应系统,而非让系统适应 Spring Security,是 Spring Security 框架开发者和使用者的共识. 下面我们将使用自定义数据库模型接入Spri ...

  2. 看清spring security 认证流程,自定义认证方式

    一.文献参考 Spring Security认证与授权的原理(源码分析,超详细)_Zystem-CSDN博客_springsecurity认证原理 spring security为什么这么复杂? - ...

  3. 易商云页面认证失败是什么情况_Serverless 云原生框架 Malagu:认证与授权

    认证与授权组件 @malagu/security .Malagu 框架结合传统后台管理系统和云计算平台的认证与授权理念,并借鉴了 Spring Security 设计思想,抽象了一套通用的认证与授权模 ...

  4. Spring Security认证过程

    2019独角兽企业重金招聘Python工程师标准>>> Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一 ...

  5. spring security认证的底层实现

    一.官方认证图 发起认证请求,请求中携带用户名.密码,该请求会被UsernamePasswordAuthenticationFilter 拦截 在UsernamePasswordAuthenticat ...

  6. Java认证授权框架Spring Security介绍

    Spring Security 是一个非常强大的身份验证和授权控制框架.为了满足企业项目的不同需求,它提供了很多定制化开发的解决方案,通过简单的调整配置,就能为我们的应用提供一套可靠的安全保障.本节课 ...

  7. Spring Security 认证授权详解

    1.Spring Security 概述 1.1.Spring Security 简介 Spring Security 是 Spring 家族中的成员.Spring Security 基于 Sprin ...

  8. 鉴权/认证框架Spring Security和Apache Shiro比较

    参考: https://www.cnblogs.com/minxiang-luo/p/12492905.html https://www.javadevjournal.com/spring-boot/ ...

  9. Spring Security认证授权练手小项目 腾讯视频VIP权限管理功能

    腾讯视频VIP权限管理 1.项目功能视频演示 2.需求与设计 1.需求 2.功能概要 3.接口设计 3.项目源码结构 4.项目源码下载 5.项目部署 1.部署架构 2.数据库环境准备 3.redis环 ...

最新文章

  1. MySQL分布式事务(XA事务)
  2. WebStorm无法显示文件夹目录
  3. 中国超细旦丝现状调研及投资前景评估报告2022-2028年版
  4. 谷歌大一统?Fuchsia OS已可提供完整的Chrome浏览器体验
  5. Linux关机命令和重启命令
  6. codeforces1438 E.Yurii Can Do Everything
  7. 浅析haartraining方法进行人脸检测
  8. 计算机网络原理(第二章)课后题答案
  9. for循环一种不常见的用法
  10. linux文件挂载和卸载命令,Linux基础命令(八)——挂载、卸载文件系统
  11. VS2017社区版离线安装
  12. 诺基亚N1 WIFI感叹号消除
  13. 用Hight-Speed Charting绘制时间电压动态曲线
  14. Can not squeeze dim[1], expected a dimension of 1
  15. TransUNet:Transformers Make Strong Encoders for Medical Image Segmentation用于医疗图像分割的transformers编码器详解
  16. 象棋机器人 1 数据分析收集-爬虫编写
  17. 删除群晖NAS回收站中的临时文件
  18. 没有登录进windows时有什么进程在运行
  19. 数据结构:图的基础知识
  20. 关于主机的思维导图_「停课不停学」思维导图—初中语文全部知识点总结,高清可打印...

热门文章

  1. ChatGPT机会与变现大全
  2. C语言 输入加减乘除运算方法
  3. 《五行斗》扑克牌游戏
  4. 计算机资源管理 教学策略,什么是教学策略?
  5. 刷脸支付不拿手机也能付款高大上
  6. 【MySQL】MySQL的存储引擎和索引详解(聚集索引和非聚集索引)
  7. 绝地求生优化服务器什么意思,绝地求生:蓝洞优化服务器性能,从此告别掉帧延迟!...
  8. 【K210】K210学习笔记五——串口通信
  9. 短线实盘赛新第20期(总第61期)
  10. Excel数据分隔方法