Realized the implementation of spring security in my project, but I'm having trouble defining a redirect. When access is locked I need to redirect that user to a specific URL.
When i put the tag "access-denied-handler" i hope he redirect to the page defined on the bean, but don't happen.
security-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<!-- Method Security -->
<security:global-method-security pre-post-annotations="enabled">
<security:expression-handler ref="expressionHandler" />
</security:global-method-security>
<bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
<property name="permissionEvaluator" ref="permissionEvaluator"/>
</bean>
<bean id="permissionEvaluator" class="net.pontoall.hemisphere.security.HemispherePermissionEvaluator"/>
<!-- Publicos -->
<security:http pattern="/layouts/**" security="none" />
<security:http pattern="/messages/**" security="none" />
<security:http pattern="/test/**" security="none" />
<security:http pattern="/resources/**" security="none" />
<security:http pattern="/login/**" security="none" />
<security:http pattern="/install/**" security="none" />
<security:http pattern="/cobredireto/**" security="none" />
<security:http pattern="/hotsite/**" security="none" />
<security:http pattern="/captcha.jpg" security="none" />
<security:http auto-config="true" use-expressions="true">
<security:access-denied-handler ref="HemisphereAccessDeniedHandler"/>
<security:intercept-url pattern="/**" access="isAuthenticated()" />
<security:form-login login-page="/login" default-target-url="/home"
authentication-failure-url="/login?logout=true"
authentication-success-handler-ref="authenticationSuccessHandler"
authentication-failure-handler-ref="authenticationFailureHandler"/>
<security:logout logout-url="/j_spring_security_logout" invalidate-session="true" success-handler-ref="logoutHandler"/>
</security:http>
<!-- Authentication Manager -->
<security:authentication-manager alias="authenticationManager">
<!-- Custom Authentication provider -->
<security:authentication-provider ref="hemisphereAuthenticationProvider"/>
</security:authentication-manager>
<bean id="hemisphereAuthenticationProvider" class="net.pontoall.hemisphere.security.HemisphereAuthenticationProvider">
<property name="userDetailsService" ref="userDetailService"/>
</bean>
<bean id="authenticationSuccessHandler" class="net.pontoall.hemisphere.security.HemisphereAuthenticationSuccessHandler">
<property name="defaultTargetUrl" value="/home" />
<property name="alwaysUseDefaultTargetUrl" value="no" />
</bean>
<bean id="authenticationFailureHandler" class="net.pontoall.hemisphere.security.HemisphereAuthenticationFailureHandler">
<property name="defaultFailureUrl" value="/login" />
</bean>
<bean id="logoutHandler" class="net.pontoall.hemisphere.security.HemisphereLogoutHandler"/>
<bean id="HemisphereAccessDeniedHandler" class="net.pontoall.hemisphere.security.HemisphereAccessDeniedHandler">
<property name="errorPage" value="/error/permissao"/>
</bean>
Bean Java - HemisphereAccessDeniedHandler.java:
public class HemisphereAccessDeniedHandler implements AccessDeniedHandler {
private String errorPage;
public String getErrorPage() {
return errorPage;
}
public void setErrorPage(String errorPage) {
if (errorPage == "") {
errorPage = "/";
}
this.errorPage = errorPage;
}
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
// Set the 403 status code.
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.sendRedirect(errorPage);
}
}
I discovered what was happening. I have a Spring MVC @ExceptionHandler and he is capturing the error.
@ExceptionHandler
public ResponseEntity<String> handle(Exception exception, HttpServletRequest requestMain) {
String erro = exception.getMessage();
PusherRequest request = new PusherRequest("hemisphere-web", requestMain.getSession().getId());
request.triggerPush(erro);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return new ResponseEntity<String>(exception.getMessage(), headers, HttpStatus.FORBIDDEN);
}
Redirect has its own HTTP status code (3xx), see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html . The method response.sendRedirect
should automatically set the HTTP status code to 307 (Temporary Redirect, see http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpServletResponse.html#sendRedirect ).
But you're setting the HTTP status code to Forbidden (403) prior to redirect.
Therefore try removing the response.setStatus(HttpServletResponse.SC_FORBIDDEN)
. You could also post a curl
dump to see the raw server output.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.