您现在的位置是:首页 >其他 >spring security网站首页其他

spring security

爱穿背带裤的馫 2024-07-21 06:01:03
简介spring security

简介

Spring Security对Web安全性的支持大量地依赖于Servlet过滤器。这些过滤器拦截进入请求,并且在应用程序处理该请求之前进行某些安全处理。 Spring Security提供有若干个过滤器,它们能够拦截Servlet请求,并将这些请求转给认证和访问决策管理器处理,从而增强安全性。根据自己的需要,可以使用适当的过滤器来保护自己的应用程序。
如果使用过Servlet过滤器且令其正常工作,就必须在Web应用程序的web.xml文件中使用 和元素配置它们。虽然这样做能起作用,但是它并不适用于使用依赖注入进行的配置。
FilterToBeanProxy是一个特殊的Servlet过滤器,它本身做的工作并不多,而是将自己的工作委托给Spring应用程序上下文 中的一个Bean来完成。被委托的Bean几乎和其他的Servlet过滤器一样,实现javax.servlet.Filter接 口,但它是在Spring配置文件而不是web.xml文件中配置的。
实际上,FilterToBeanProxy代理给的那个Bean可以是javax.servlet.Filter的任意实现。这可以是 Spring Security的任何一个过滤器,或者它可以是自己创建的一个过滤器。但是正如本书已经提到的那样,Spring Security要求至少配置四个而且可能一打或者更多的过滤器。

分为:认证和授权

认证:自定义User查询类

授权:

①权限授权

数据库授权表存的是 "admin"
单个授权
// 当前用户只有具有admin权限才可以访问这个路径
 .antMatchers("/test/index").hasAuthority("admin")
 
 数据库授权表存的是 "admin""ctrl"
多个个授权
// 当前用户只有具有admin或ctrl权限才可以访问这个路径
.antMatchers("/test/index").hasAnyAuthority("admin","ctrl")

②角色授权

数据库角色表存的是 "ROLE_admin"
单个角色
 // 当前角色只有是ROLE_admin角色才可以访问
.antMatchers("/test/index").hasRole("admin")

数据库角色表存的是 "ROLE_admin""ROLE_ctrl"
单个角色
 // 当前角色只有是ROLE_admin或ROLE_ctrl角色才可以访问
.antMatchers("/test/index").hasAnyRole("admin","ctrl")

注解功能:

开启注解功能
将 @EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true) 放在启动了或者配置类上

String[] permissions = "ADMIN2,ROLE_ADMIN".split(",");
List<GrantedAuthority> authorities = new ArrayList<>();
for (String permission : permissions) {
    authorities.add(new SimpleGrantedAuthority(permission));
}
userDetails.setAuthorities(authorities);
@PreAuthorize("hasRole('ADMIN')")                //允许
@PreAuthorize("hasRole('ROLE_ADMIN')")           //允许
@PreAuthorize("hasRole('ADMIN2')")               //不允许
@PreAuthorize("hasRole('ROLE_ADMIN2')")          //不允许
@PreAuthorize("hasAuthority('ADMIN2')")          //允许
@PreAuthorize("hasAuthority('ROLE_ADMIN2')")     //不允许
@PreAuthorize("hasAuthority('ADMIN')")           //不允许
@PreAuthorize("hasAuthority('ROLE_ADMIN')")      //允许

数据库表设计

用户表(user)和角色表(role)  多对多关系
user_role  中间表

菜单表(menu)和角色表  多对多关系
menu_role 中间表

如果想实现按钮权限级别的  新增 删除 修改 
接口表(api)和角色表  多对多关系 每个controller的访问路径
接口表_role   中间表

总体来看,我们需要七张表:用户表、角色表、用户角色中间表、菜单表、菜单角色中间表、接口表、接口角色中间表

用户表(user):
id 主键
username 用户名称
password 密码
nickname 昵称
email 邮箱
avatar 头像
phone 联系电话
create_time 创建时间
update_time 修改时间
status 是否可用
sex 性别
type 用户类型 0 超级管理员 1 普通用户
brith 生日
last_login 最后登录时间

角色表(role):
id
role_code   角色权限
role_name   角色名称
create_time 创建时间
update_time 修改时间

用户角色中间表(user_role):
id
user_id     对应用户主键
role_id     对应角色主键
create_time 创建时间
update_time 修改时间

菜单表(menu):
id 主键
parent_id 上级菜单
menu_name 菜单名字
router_url 菜单路由
perms 权限标识
icon 菜单图标
type 类型 0菜单 1按钮
menu_sort 排序
create_time 创建时间
update_time 修改时间
status 是否可用
open 是否展开菜单

菜单角色中间表(menu):
id 主键
menu_id     对应菜单主键
role_id     对应角色主键
create_time 创建时间
update_time 修改时间


接口表(api):
id 主键
api_name 接口名称
api_url 接口路径
api_mothod 接口类型
parent_id 父id
api_sort 排序
create_time 创建时间
update_time 修改时间
status 是否可用
des 描述

接口角色表中间表(api_role)
id
api_id      对应接口主键
role_id     对应角色主键
create_time 创建时间
update_time 修改时间

SpringSecurity常用的注解
6.1 @EnableGlobalMethodSecurity(securedEnabled=true,prePostEnabled = true)
securedEnabled 确定安全注解 [@Secured] 是否启用
prePostEnabled 确定 前置注解[@PreAuthorize,@PostAuthorize,…] 是否启用

6.2 @Secured
是专门用于判断是否具有角色的。能写在方法或类上,参数要以 ROLE_开头

6.3 @PreAuthorize
表示访问方法或类在执行之前先判断权限,大多情况下都是使用这个注解,注解的参数和access()方法参数取值相同,都是权限表达式。

6.4 @PostAuthorize
表示方法或类执行结束后判断权限,此注解很少被使用到。

6.5@PreFilter(filterTarget=“ids”, value=“filterObject%2==0”)
对传入参数进行过滤,为true才通过,filterTarget指定传入方法参数的变量名ids,对ids进行过滤,为true才通过

6.6@PostFilter(“filterObject.username == ‘admin1’”)
对返回结果进行过滤,为true才通过

7、SpringSecurity设置自动登录
自定义登录页面的表单直接添加下面这行即可,但是name一定要为remember-me,这个是框架的默认值,不然无法识别


风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。