用户具有某个角色,可以访问方法。另外需要注意的是这里匹配的字符串需要添加前缀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 wrapper = new QueryWrapper<>();
wrapper.eq("username",username);
Users users = userMapper.selectOne(wrapper);
// 判断用户对象是否为空
if(null == users){
throw new UsernameNotFoundException("用户名不存在!");
}
// 获取到用户角色,菜单列表
List roles = userMapper.selectRoleByUserId(Long.valueOf(users.getId()));
List
测试
使用张三账号登录
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 getAllUser(){
List 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 getTestPreFilter(@RequestBody List 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"
}
]
允许结果:



