Я использую preAuthorize в коде контроллера, в котором есть метод isAuthenticated () и hasAnyRole (). Проблема заключается в том, что оба эти метода возвращают AccessDeniedException. Я хочу использовать отдельный код ошибки или то же исключение другой код ошибки. Как для isAuthenticated use 401 и для roleBased error 403.
Я пробовал несколько вещей, например, пользовательский AccessDeniedHandler, но он не работал.
Следующий код, который я использовал:
<sec:http auto-config='false' use-expressions="true" disable-url-rewriting="true" entry-point-ref="http401UnauthorizedEntryPoint">
<sec:headers disabled="true"/>
<sec:csrf disabled="true"/>
<sec:anonymous/>
<sec:session-management session-fixation-protection="newSession"/>
<sec:custom-filter ref="standardUsernamePasswordAuthFilter" position="FORM_LOGIN_FILTER" />
standardUsernamePasswordAuthFilter filter -->
<sec:custom-filter ref="sessionProtectionFilter" before="SESSION_MANAGEMENT_FILTER"/>
<sec:logout invalidate-session="true" logout-url="/logout" success-handler-ref="http200LogoutSuccessHandler"/>
</sec:http>
public class Http401UnauthorizedEntryPoint implements AuthenticationEntryPoint {
private static final Log logger = LogFactory.getLog(Http401UnauthorizedEntryPoint.class);
/**
* Always returns a 401 error code to the client.
*/
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException arg2) throws IOException, ServletException {
logger.trace("Pre-authenticated entry point called. Rejecting access");
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
}
}
Ниже приведен код AccessDeniedHandler:
public class CustomAccessDeniedHandler implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request,HttpServletResponse response,AccessDeniedException exc)
throws IOException, ServletException {
System.out.println("AccessDeniedException=="+exc.getMessage());
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
System.out.println("auth=="+auth);
if (auth != null) {
System.out.println("User: " + auth.getName()
+ " attempted to access the protected URL: "
+ request.getRequestURI());
}
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized");
}
}
And entries in xml for this:
<bean id="custom403" class="com.security.CustomAccessDeniedHandler" />
<sec:access-denied-handler ref="custom403"/>```