SpringSecurity认证授权的注解使用
【摘要】 @toc 1、@Secured注解判断是否具有角色,另外需要注意的是这里匹配的字符串需要添加前缀“ROLE_“。 1.1 启动类开启注解使用注解先要开启注解功能!先在启动类上加如下注解@EnableGlobalMethodSecurity(securedEnabled=true) 1.2 在controller的方法上面使用注解,设置角色 @GetMapping("update") @...
@toc
1、@Secured注解
判断是否具有角色,另外需要注意的是这里匹配的字符串需要添加前缀“ROLE_“。
1.1 启动类开启注解
使用注解先要开启注解功能!先在启动类上加如下注解
@EnableGlobalMethodSecurity(securedEnabled=true)
1.2 在controller的方法上面使用注解,设置角色
@GetMapping("update")
@Secured({"ROLE_sale","ROLE_manager"})
public String update(){
System.out.println("update......");
return "hello update";
}
1.3 userDetailService设置用户角色
关键代码:
完整代码如下:userDetailService.java
package com.atguigu.springsecuritydemo1.service;
import com.atguigu.springsecuritydemo1.entity.Users;
import com.atguigu.springsecuritydemo1.mapper.UsersMapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.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.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("userDetailsService")
public class MyUserDetailService implements UserDetailsService {
@Autowired
private UsersMapper usersMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//调用userMapper中的方法,根据用户名查询数据库
QueryWrapper<Users> wrapper=new QueryWrapper<>();//条件构造器
//where username=?
wrapper.eq("username",username);
Users users= usersMapper.selectOne(wrapper);
//判断
if(users==null){ //数据库没有用户名,认证失败
throw new UsernameNotFoundException("用户名不存在!");
}
List<GrantedAuthority> auths= AuthorityUtils.commaSeparatedStringToAuthorityList("admins,ROLE_sale");
//从查询数据库返回user对象,得到用户名和密码,返回
return new User(users.getUsername(),new BCryptPasswordEncoder().encode(users.getPassword()),auths);
}
}
1.4 启动测试
项目启动后,访问http://localhost:8111/test/update
输入 lucy 123
控制台信息:
2、@PreAuthorize注解
@PreAuthorize:注解适合进入方法前的权限验证, @PreAuthorize 可以将登录用户的 roles/permissions 参数传到方法中。
2.1 开启注解功能
@EnableGlobalMethodSecurity(prePostEnabled = true)
2.2 在controller的方法上添加注解
@GetMapping("update")
@PreAuthorize("hasAnyAuthority('admins')")
public String update(){
System.out.println("update......");
return "hello update";
}
3、@PostAuthorize注解
先开启注解功能:
@EnableGlobalMethodSecurity(prePostEnabled = true)
@PostAuthorize 注解使用并不多,在方法执行后再进行权限验证,适合验证带有返回值的权限.
4、@PostFilter注解
@PostFilter :权限验证之后对数据进行过滤
表达式中的 filterObject 引用的是方法返回值 List 中的某一个元素
@GetMapping("getAll")
@PostAuthorize("hasAnyAuthority('admins')")
@PostFilter("filterObject.username == 'admin1'")
public List<Users> getAllUser(){
ArrayList<Users> list = new ArrayList<>();
list.add(new Users(11,"admin1","6666"));
list.add(new Users(21,"admin2","888"));
System.out.println(list);
return list;
}
上面代码只留下用户名是 admin1 的数据
5、@PreFilter注解
@PreFilter: 进入控制器之前对数据进行过滤
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)