SpringBoot学习总结(七)-安全框架SpringSecurity(二)

113 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看详情

上文讲了spring security安全框架中的认证,本文将继续讲该框架中的授权; 授权:顾名思义就是授予权限,即对访问权限的控制,控制用户可以访问那些资源与数据,哪些不能,根据系统中对角色,用户,资源进行分配绑定,再由系统来判断该用户是否具有某些权限,在执行相关操作;该框架中授权的核心概念是在登录认证成功后将用户信息保存在Authentication对象中,由该对象下的getAuthorities()方法来获取该用户所具备的权限信息,根据该方法返回的权限集合Collection(?extends GrantedAuthority)进行权限判断;这里的GrantedAuthority(授权)指的是根据角色、资源进行权限控制;

springSecurity中提供的常用权限控制方法
permitAll()放行所有请求
hasAuthority(String auth)当前用户具备指定权限
hasAnyAuthoirty(String... auth)当前用户具备指定权限中某一个
hasRole(String role)当前用户具备某角色
hasAnyRole(String... roles)当前用户具备指定角色中某一个
denyAll()拒绝所有请求

图片.png

基于数据库进行简单权限控制示例
//实体类
@Data
public class Menu {
private Long id;
private String name;
private String url;
private Long parentId;
private String permission;
}
@Data
public class Role {
private Long id;
private String name;
}
//接口与实现类
// mapper 根据用户 Id 查询用户角色
List<Role> selectRoleByUserId(Long userId);
// mapper 根据用户 Id 查询菜单
List<Menu> selectMenuByUserId(Long userId);
//xml文件中为简单的查询SQL

实现类 图片.png 配置类 图片.png 当使用没有该角色和权限的用户进行访问时会跳转403页面,可以配置跳转提示页面;

图片.png 除了配置类方式,还有更加便捷的注解方式,通过注解将权限控制在方法中,更加灵活与便捷; 启动类添加注解@EnableGlobalMethodSecurity(securedEnabled=true)开启注解功能;该注解中开启不同注解需要参数不同;

//常用权限检验注解
@Secured({"ROLE_normal","ROLE_管理员"})
在开启注解中添加 securedEnabled=true 该注解用来判断用户是否有某个角色,需要在匹配的字符串前添加固定前缀 'ROLE_';
@PreAuthorize("hasAnyAuthority('menu:system')")参数可以hasRole(('ROLE_admin'))
在开启注解中添加 prePostEnabled = true 该注解适用于进入方法前的权限验证,可以将角色或权限信息作为参数进行校验;
@PostAuthorize("hasAnyAuthority('menu:system')")
与上个方法相同,该注解适用于方法执行后进行权限校验,验证带有返回值的权限;
@PreFilter 使用于过滤进入控制器之前的数据
@PostFilter("filterObject.username == 'admin1'")只会返回username为admin1的数据
@PostFilter 适用于过滤返回的数据
@PreFilter(value = "filterObject.id%2==0")只会接收到对2取余数为0的数据

此外该框架还可以通过配置实现记住我功能:

// 开启记住我功能
http.rememberMe()
    .tokenRepository(tokenRepository)
    .userDetailsService(usersService);
//前端页面中name为remember-me才会生效,当用户注销时需要重新登录
记住我:<input type="checkbox"name="remember-me"title="记住密码"/><br/>
CRSF的理解

crsf全拼为 Cross site request forgery 意为跨站点请求伪造,是一种通过利用网站对用户浏览器信任,通过web应用程序中已登录用户信息执行的恶意操作的攻击方法,可以利用该用户身份进行发送邮件,消息,盗取账号,甚至购买,售出,删除数据等操作;流程为在某站点用户登录后没有注销或登出操作时访问其他站点导致其他站点向某站点发送恶意请求,某站点出于对该用户信息的信任而执行了该操作;

//在springsecurity框架中只需要关闭安全配置类中crsf即可
// http.csrf().disable();

实现机制为生成crsfToken保存在session或cookie中经过CsrfFilter过滤器来判断保存的token与当前请求中包含的token是否合法来进行保存;