当前位置: 首页 > 知识库问答 >
问题:

在Spring启动安全系统中关闭授权服务时的授权错误处理

淳于功
2023-03-14

在我的spring boot web应用程序中,我使用了第三方服务进行授权,我的应用程序只是一个内容提供商。父应用程序使用site minder进行身份验证。我的应用程序在头中获取用户Id,并调用第三方api设置具有权限的UserDetails。

我的要求是处理场景时,第三方服务的授权是关闭。目前,在本例中,我将UserDetails设置为没有角色,因为每个endpoint都被授权绑定,所以如果授权的第三方服务关闭,我将得到403。

但我想显示不同的消息,如果用户缺乏授权和授权服务关闭。

public class WebSecurityCustomConfig extends WebSecurityConfigAdapter {
 private UserDetailsService userDetails;
 protected void configure(HttpSecurity http) {
   http.csrf().disable().authorizeRequests().antMatchers("/*).permitAll()
   .anyRequests()
   .hasAnyAuthority("MODULEX","MODULEY");

 http.addFilterBefore(requestHeaderAuthFilter(), 
   BasicAuthenticationFilter.class);
    http.exceptionHandling().authenticationEntryPoint(customEntryPoint());
 }

 protect void configure(AuthenticationManagerBuilder builder) {
   PreAuthenticaticatedAuthenticationProvider auth = new 
             PreAuthenticaticatedAuthenticationProvider ();
  auth.setPreAuthenticatedUserDetailsService(new 
      UserDetailsByNameServiceWrapper<>(userDetails));
  }
 }
  public class CustomUserDetailsService implements UserDetailsService {
    private final AuthorizationService authService;
    @Inject
     public CustoUserDetailsService(AuthorizationService authService) {
       this.authService = authService;
       }
       public UserDetails loadUserByUsername(String username) {
         return new User(username, "", 
                 authService.getAuthorities(username));  
        // authService is a  third party jar and if their upstream service 
           //is down , it throws a runtime exception
      }
      }

当前处理auth服务异常

     public UserDetails loadUserByUsername(String username) {
         try{
         return new User(username, "", 
                 authService.getAuthorities(username));  
       }
          catch(AuthServiceException e) {
               return new User(username, "", 
                 Collections.emptyList());  
               } 
      }

共有1个答案

濮阳旺
2023-03-14

实现authenticationentrypoint并重写commentence()方法,如下所示。

public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(
            HttpServletRequest request, 
            HttpServletResponse response, 
            AuthenticationException authException) throws IOException, ServletException {

        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");

    }

}

然后,在WebSecurityCustomConfig类中创建一个方法,初始化RestAuthenticationEntryPoint类,如下所示。

public AuthenticationEntryPoint authenticationEntryPoint() {
    RestAuthenticationEntryPoint ep = new RestAuthenticationEntryPoint();
    return ep;
}

然后将以下行更改为http.exceptionHandling().authenticationEntryPoint(customEntryPoint());
改为
http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint());

 类似资料:
  • 我有两个Spring启动应用程序。后端部分-可以访问数据库,它用作Rest API和管理面板。前端部分-使用Rest API为客户端显示信息。 因此,我对客户端(前端)的配置安全性有问题,对管理面板也有问题,授权是通过会话实现的。以前,客户端部分的授权是通过JWT令牌实现的,但我不太明白如何为每个客户端存储令牌,并在向Rest API发送请求时使用它。 这是我的安全配置: 那么,可以使用JWT令牌

  • 我在下面设置Spring配置: 和Maven设置如下:

  • 我是Spring boot和Spring Security的新手,出现以下错误: “错误401未经授权(c.e.l.security.jwt.AuthEntryPointJwt:未经授权的错误:访问此资源需要完全身份验证)” 我试过这个认证 我的问题是,当我成功登录时,我想请求获取用户列表。我发送的请求是一个安全GET请求,它是http://localhost:8084/loginsystem/a

  • 问题内容: 我从Nexus存储库中检出了代码。我更改了帐户密码,并在文件中正确设置了密码。在执行时,我收到错误消息,说明它尝试从该存储库下载文件。 任何想法如何解决此错误?我在Maven 3.04中使用Windows 7 问题答案: 这里的问题是所使用的密码出现错字错误,由于密码中使用了字符/字母,因此很难识别。

  • 我有一个多租户项目,它将调用多个微服务来执行特定任务。 我希望微服务从发送的请求中了解要使用哪个DB,因为每个租户都将使用微服务,但是,租户将拥有自己的DB。我有另一个解决方案,它有一个处理API密钥管理的Web项目。 比方说,API密钥管理位于域:portal.example.com 当 tenant.example.com 在 microservice.example.com 调用微服务时,我

  • im使用spring security和spring boot开发应用程序,使用SecurityConf保护我的api im的特定endpoint,如下所示: 密码和用户名从数据库开始加载。 一切似乎都工作正常,但现在我必须实现一个方法来更改管理员的密码,我实现了存储库、服务和控制器方法来使用新的加密密码更改DB,但就目前而言,除非我重新启动它,否则更改不会反映在应用程序中(这会导致类加载新的用户