Spring Security @PreAuthorize带有AuthenticationSuccessEvent的注释

Vjekoslav Krainovic:

我具有基本身份验证,我想在成功登录后执行一些操作,但是AuthenticationSuccessEvent正在启动,即使该ROLE没有权限我也需要访问该HTTP方法。仅当我可以在允许的情况下访问该HTTP方法时,才可以记录/执行某些操作。

@Component("authorization")
public class AuthorizationUtils {

    public boolean hasPermission(final String permission) {
        Collection<? extends GrantedAuthority> authorities = getUserDetails().getAuthorities();
        return authorities.contains(new SimpleGrantedAuthority(permission));
    }

    public static UserDetails getUserDetails() {
        SecurityContext securityContext = SecurityContextHolder.getContext();
        Authentication authentication = securityContext.getAuthentication();
        if (authentication != null && authentication.getPrincipal() instanceof UserDetails) {
            return (UserDetails) authentication.getPrincipal();
        }
        return null;
    }

}
public class AuthenticationEventListener implements ApplicationListener<AuthenticationSuccessEvent> {

  @Autowired
  private HttpServletRequest request;

  @Override
  public void onApplicationEvent(AuthenticationSuccessEvent event) {

    String username = ((UserAccountDetails) event.getAuthentication().getPrincipal()).getUsername();

    log.trace("Account with username : {} successfully log in!", username);

    System.out.println(request.getHeader("Authorization"));
  }
  @GetMapping("/permission")
  @PreAuthorize("@authorization.hasPermission('edit.helloworld123')")
  public String editHelloWorld(){
    return "Welcome to permission edit.helloWorld!";
  }
陈健:

授权与身份验证不同。身份验证是关于用户是否可以成功登录的信息。授权是关于登录用户是否具有执行方法的足够权限。因此,即使用户成功登录(即AuthenticationSuccessEvent发生),如果他没有足够的权限执行方法,该方法仍然无法执行。

您真正想要的是检测授权成功事件,但是现在您正在检测身份验证成功事件,这是完全不同的事情。

为了使谁拥有足够的权限成功执行保护方法的用户之后发布的授权成功的事件,您必须启用setPublishAuthorizationSuccessMethodInterceptor

文档覆盖与方法安全性相关的默认设置,您可以扩展GlobalMethodSecurityConfiguration

@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {

    @Override
    public MethodInterceptor methodSecurityInterceptor(MethodSecurityMetadataSource methodSecurityMetadataSource) {
        MethodInterceptor result = super.methodSecurityInterceptor(methodSecurityMetadataSource);
        ((MethodSecurityInterceptor) result).setPublishAuthorizationSuccess(true);
        return result;
    }
}

并且AuthorizedEvent将在用户具有足够的权限执行受保护的方法后发布。因此请创建一个ApplicationListener侦听和处理它的方法:

@Component
public class MyEventListener implements ApplicationListener<AuthorizedEvent> {

    @Override
    public void onApplicationEvent(AuthorizedEvent event) {
        //Handle the AuthorizedEvent event here......
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章