七SpringSecurity Web权限方案——注解使用
Posted 上善若水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七SpringSecurity Web权限方案——注解使用相关的知识,希望对你有一定的参考价值。
一、注解使用
1.1、@Secured
用户具有某个角色,可以访问方法。另外需要注意的是这里匹配的字符串需要添加前缀ROLE_
。
- 使用注解,先要开启注解功能!
@EnableGlobalMethodSecurity(securedEnabled = true)
- 在控制器方法上添加注解
- 给用户设置角色
- 测试
登录之后直接访问:http://localhost:8081/hello/testSecured
1.2、@PreAuthorize
- 先开启注解功能
@EnableGlobalMethodSecurity(prePostEnabled = true)
@PreAuthorize
:注解适合进入方法前的权限验证,@PreAuthorize
可以将登录用
户的roles/permissions
参数传到方法中。
- 在控制器方法上添加注解
- 给用户设置角色
package com.xbmu.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xbmu.entity.Menu;
import com.xbmu.entity.Role;
import com.xbmu.entity.Users;
import com.xbmu.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
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;
@Service
@Slf4j
public class LoginService implements UserDetailsService
@Autowired
private UserMapper userMapper;
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
QueryWrapper<Users> wrapper = new QueryWrapper<>();
wrapper.eq("username",username);
Users users = userMapper.selectOne(wrapper);
// 判断用户对象是否为空
if(null == users)
throw new UsernameNotFoundException("用户名不存在!");
// 获取到用户角色,菜单列表
List<Role> roles = userMapper.selectRoleByUserId(Long.valueOf(users.getId()));
List<Menu> menus = userMapper.selectMenuByUserId(Long.valueOf(users.getId()));
// 声明一个集合
List<GrantedAuthority> grantedAuthorityList = new ArrayList<>();
// 处理角色
for (Role role : roles)
SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority("ROLE_".concat(role.getName()));
grantedAuthorityList.add(simpleGrantedAuthority);
// 处理权限
for (Menu menu : menus)
grantedAuthorityList.add(new SimpleGrantedAuthority(menu.getPermission()));
// 将用户角色,权限添加到当前用户
return new User(users.getUsername(),users.getPassword(),grantedAuthorityList);
- 测试
使用张三账号登录
1.3、@PostAuthorize
- 先开启注解功能
@EnableGlobalMethodSecurity(prePostEnabled = true)
@PostAuthorize
注解使用并不多,在方法执行后在进行权限验证,适合验证带有返回值的权限。 - 在控制器方法上添加注解
@RequestMapping("testPostAuthorize")
@PostAuthorize("hasAnyAuthority('menu:system')")
public String preAuthorize()
System.out.println("test--PostAuthorize");
return "PostAuthorize";
- 测试
1.4、@PostFilter
@PostFilter
:权限验证之后对数据进行过滤,表达式中的 filterObject 引用的是方法返回值 List 中的某一个元素
- 在控制器方法上添加注解
@RequestMapping("getAll")
@PostFilter("filterObject.username=='admin1'")
public List<Users> getAllUser()
List<Users> list = new ArrayList<>();
list.add(new Users(1,"admin1","666"));
list.add(new Users(2,"admin2","888"));
return list;
- 测试
留下用户名是 admin1 的数据
1.5、@PreFilter
@PreFilter
:进入控制器之前对数据进行过滤
- 给控制器方法增加注解
@RequestMapping("getTestPreFilter")
@PreFilter(value = "filterObject.id%2==0")
public List<Users> getTestPreFilter(@RequestBody List<Users> list)
list.forEach(t->
System.out.println(t.getId()+"\\t"+t.getUsername());
);
return list;
- 测试
使用postman测试
[
"id": "1",
"username": "admin",
"password": "666"
,
"id": "2",
"username": "admins",
"password": "888"
,
"id": "3",
"username": "admins11",
"password": "11888"
,
"id": "4",
"username": "admins22",
"password": "22888"
]
允许结果:
以上是关于七SpringSecurity Web权限方案——注解使用的主要内容,如果未能解决你的问题,请参考以下文章
尚筹网项目 七后台 权限控制 ( 项目中加入 SpringSecurity )
六SpringSecurity Web权限方案—— 基于数据库实现权限认证