12、SpringSecurity实战:基于表达式的访问控制

基于表达式的访问控制

    • 1.access()方法使用
    • 1.1 以 hasRole 和 permitAll 举例
  • 2.使用自定义方法
    • 2.1 新建接口及实现类
    • 2.2 修改配置类

1.access()方法使用

  • 之前的登录用户权限判断实际上底层实现都是调用 access(表达式)
    *
  • 可以通过 access()实现和之前学习的权限控制完成相同的功能

1.1 以 hasRole 和 permitAll 举例

  • 下面代码和直接使用 permitAll()和 hasRole()是等效的。
    *

2.使用自定义方法

  • 虽然这里面已经包含了很多的表达式(方法)但是在实际项目中很有可能出现需要自己自定义逻辑的情况。
  • 判断登录用户是否具有访问当前 URL 权限。

2.1 新建接口及实现类

  • 新建接口 com.dqcgm.service.MyService 后新建实现类
public interface MyService {
   
     
	boolean hasPermission(HttpServletRequest request, Authentication authentication);
}

@Component
public class MyServiceImpl implements MyService {
   
     
	@Override
	public boolean hasPermission(HttpServletRequest request, Authentication authentication) {
   
     
		Object obj = authentication.getPrincipal();
		if(obj instanceof UserDetails){
   
     
			UserDetails user = (UserDetails) obj;
			Collection<? extends GrantedAuthority> authorities = user.getAuthorities();
			return authorities.contains(new SimpleGrantedAuthority(request.getRequestURI()));
		}
		return false;
	}
}

2.2 修改配置类

  • 在 access 中通过@bean 的 id 名.方法(参数)的形式进行调用
  • 配置类中修改如下:
// url 拦截 (授权)
http.authorizeRequests()
	.antMatchers("/login.html").access("permitAll")
	.antMatchers("/fail.html").permitAll()
	.anyRequest().access("@myServiceImpl.hasPermission(request,authentication)");

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: