欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Security中使用注解进行用户授权

程序员文章站 2024-03-19 16:03:16
...

@Secured

功能:判断是否具有角色,另外需要注意的是这里匹配的字符串需要添加前缀“ROLE_”。

示例:
Spring Security中的用户授权的基础上进行修改。
使用@EnableGlobalMethodSecurity(securedEnabled=true)开启该注解功能。

package com.rixin.springsecuritydemo2;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;

@MapperScan("com.rixin.springsecuritydemo2.mapper")
@EnableGlobalMethodSecurity(securedEnabled=true)
@SpringBootApplication
public class Springsecuritydemo2Application {

    public static void main(String[] args) {
        SpringApplication.run(Springsecuritydemo2Application.class, args);
    }

}

在控制器方法上添加注解@Secured。

package com.rixin.springsecuritydemo2.controller;

import org.springframework.security.access.annotation.Secured;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("hello")
    public String add() {
        return "hello security";
    }

    @GetMapping("index")
    public String index() {
        return "hello index";
    }

    @GetMapping("update")
    @Secured({"ROLE_sale","ROLE_manager"})
    public String update() {
        return "hello update";
    }

}

@PreAuthorize

功能:注解适合进入方法前的权限验证,@PreAuthorize可以将登录用户的roles/permissions参数传到方法中。

示例:
先开启注解功能:

package com.rixin.springsecuritydemo2;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;

@MapperScan("com.rixin.springsecuritydemo2.mapper")
@EnableGlobalMethodSecurity(securedEnabled=true,prePostEnabled = true)
@SpringBootApplication
public class Springsecuritydemo2Application {

    public static void main(String[] args) {
        SpringApplication.run(Springsecuritydemo2Application.class, args);
    }

}

控制器中加入注解:

    @GetMapping("update")
    //@Secured({"ROLE_sale","ROLE_manager"})
    @PreAuthorize("hasAnyAuthority('manager')")
    public String update() {
        return "hello update";
    }

@PostAuthorize

功能:在方法执行之后再进行权限验证,适合验证带有返回值的权限。

用法与上面相同。

@PostFilter

功能:权限验证之后对返回的数据进行过滤。

示例:
控制器中加入以下代码

    @GetMapping("getAll")
    @PreAuthorize("hasAnyAuthority('manager')")
    @PostFilter("filterObject.username == '44'")
    public List<User> getAllUser() {
        ArrayList<User> list = new ArrayList<>();
        list.add(new User(1,"22","33"));
        list.add(new User(2,"44","33"));
        return list;
    }

登录后页面显示:

[{"id":2,"username":"44","password":"33"}]

@PreFilter

功能:进入控制器之前对传入方法的数据进行过滤。

用法与上面相同。