七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权限方案

[SpringSecurity]web权限方案_用户注销

六SpringSecurity Web权限方案—— 基于数据库实现权限认证

六SpringSecurity Web权限方案—— 基于数据库实现权限认证

[SpringSecurity]web权限方案_用户授权_自定义403页面