@PreAuthorize("hasPermission('or','formDialog:edit')") 中的hasPermission 怎么调用自定义的方法
时间: 2024-01-22 20:01:48 浏览: 141
在Spring Security中,我们可以通过自定义的AccessDecisionVoter来实现自定义权限校验。你可以通过以下步骤来实现:
1. 创建一个实现了AccessDecisionVoter接口的自定义投票器类,其中包含自定义的权限校验逻辑。
```java
public class CustomPermissionVoter implements AccessDecisionVoter<Object> {
@Override
public boolean supports(ConfigAttribute attribute) {
return attribute instanceof SecurityConfig;
}
@Override
public boolean supports(Class<?> clazz) {
return true;
}
@Override
public int vote(Authentication authentication, Object object, Collection<ConfigAttribute> attributes) {
int result = ACCESS_ABSTAIN;
for (ConfigAttribute attribute : attributes) {
if (this.supports(attribute)) {
result = ACCESS_DENIED;
// 调用自定义的权限校验方法
if (customPermissionCheck(authentication, object)) {
return ACCESS_GRANTED;
}
}
}
return result;
}
private boolean customPermissionCheck(Authentication authentication, Object object) {
// 自定义权限校验逻辑
// 返回true表示有权限,返回false表示无权限
}
}
```
2. 在WebSecurityConfigurerAdapter中注册该投票器。
```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/formDialog/edit").access("@customPermissionVoter.vote(authentication, request, 'or','formDialog:edit')") // 注册自定义投票器
.anyRequest().authenticated()
.and().formLogin().loginPage("/login").permitAll()
.and().logout().logoutSuccessUrl("/login").permitAll();
}
@Bean
public CustomPermissionVoter customPermissionVoter() {
return new CustomPermissionVoter();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("{noop}password").roles("USER")
.and()
.withUser("admin").password("{noop}password").roles("USER", "ADMIN");
}
}
```
在这里,我们在HttpSecurity中使用access()方法来注册自定义投票器,调用自定义投票器的vote()方法,其中第一个参数是Authentication对象,第二个参数是请求对象,第三个参数是权限表达式。权限表达式中的"or"表示只要满足其中一个权限即可访问,"formDialog:edit"表示需要拥有formDialog的edit权限才能访问。
3. 在方法上使用@PreAuthorize注解进行权限校验。
```java
@RestController
@RequestMapping("/formDialog")
public class FormDialogController {
@PreAuthorize("hasPermission('or','formDialog:edit')")
@PostMapping("/save")
public void saveFormDialog(@RequestBody FormDialog formDialog) {
// 保存表单对话框
}
}
```
在这里,我们在方法上使用@PreAuthorize注解进行权限校验,其中hasPermission()方法的第一个参数是逻辑运算符(and或or),第二个参数是权限表达式,该表达式将会传递给自定义投票器进行权限校验。
这样,当用户访问/formDialog/save接口时,系统将会自动调用自定义投票器的vote()方法进行权限校验,如果用户拥有formDialog:edit权限,则可以访问该接口,否则将会返回403 Forbidden错误。
阅读全文