我可以用Spring的hasAuthority计算用户授权而不抛出/捕获异常吗?

9rygscc1  于 12个月前  发布在  Spring
关注(0)|答案(1)|浏览(91)

我的Java应用程序使用Spring的@PreAuthorize("hasAuthority('SomeScopeName')") on方法来Assert用户被授权执行方法中的操作。如果用户未经授权,则此注解将抛出AccessDeniedException

@Override
@PreAuthorize("hasAuthority('SomeScopeName')")
public void assertHasDisplayAuthorization() {
    // empty on purpose
}

字符串
应用程序的一个端点想要通知用户界面用户能够执行哪些操作。为此,它计算了一个Authorizations对象,该对象呈现为JSON,如{ canDisplay: true, canEdit: false, ... }

public Authorizations getAuthorizations() {
    return new Authorizations(hasDisplayAuthorization(), hasEditAuthorization(), ...);
}


该计算调用@PreAuthorize'd方法来确定用户的授权:

private boolean hasDisplayAuthorization() {
    try {
        validator.assertHasDisplayAuthorization();
        return true;
    } catch (AccessDeniedException e) {
        return false;
    }
}


这是可行的,但我不喜欢这样的事实,我需要抛出和捕获一个异常,只是为了计算一个简单的true/false。
是否有可能计算Authorizations对象而不必抛出异常?
例如,在@Value注解中计算授权并将其分配给对象属性是否可能和可靠?

@Value("hasAuthority('SomeScopeName')")
boolean canDisplay;

... return new Authorizations(canDisplay, ...);

vddsk6oq

vddsk6oq1#

您可以使用下面的类来手动执行此操作,而不是使用@PreAuthorize

public class SecurityHelper {
  public static boolean hasAuthority(String authority) {
    Collection<? extends GrantedAuthority> authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
    return authorities.contains(new SimpleGrantedAuthority(authority));
  }
}

字符串
然后,您可以定义一个额外的类,其中包含用于检查每个范围的方法,例如:

public class AuthorityChecker {
  public static boolean hasDisplayAuthorization(){
    return SecurityHelper.hasAuthority("SomeScopeName");
  }
  //...
}


请记住,只要SecurityContext在当前线程中可用,它就可以工作,否则,它将抛出异常。

相关问题