Springセキュリティ:403アクセス拒否ページをカスタマイズする
Spring Securityでは、権限のないユーザが保護されたページにアクセスしようとすると、デフォルトの「
http 403 access denied
」が表示されます:

このチュートリアルでは、Spring Securityでアクセス拒否ページをカスタマイズする方法を説明します。
1.春のセキュリティ設定
“alex”が `/admin`ページにアクセスしようとすると、403のアクセス拒否ページが表示されます。
Spring-Security.xml
<http auto-config="true">
<access-denied-handler error-page="/403"/>
<intercept-url pattern="/admin** ** " access="ROLE__ADMIN"/>
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="alex" password="123456" authorities="ROLE__USER"/>
<user name="mkyong" password="123456" authorities="ROLE__USER, ROLE__ADMIN"/>
</user-service>
</authentication-provider>
</authentication-manager>
2.解決策 – 403ページをカスタマイズする
2.1新しい403ページを作成します。
403.jsp
<html>
<body>
<h1>HTTP Status 403 - Access is denied</h1>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-2836379775501347"
data-ad-slot="8821506761"
data-ad-format="auto"
data-ad-region="mkyongregion"></ins>
<script>
(adsbygoogle = window.adsbygoogle ||[]).push({});
</script><h2>${msg}</h2>
</body>
</html>
2.2。上記のページを表示するには、次のような `error-page`を追加します:
Spring-Security.xml
<http auto-config="true">
<access-denied-handler error-page="/403"/>
<intercept-url pattern="/admin** ** " access="ROLE__ADMIN"/>
</http>
2.3コントローラークラスで、 “/403” URLのマッピングを追加します。
HelloController.java
package com.mkyong.web.controller;
import java.security.Principal;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
//for 403 access denied page
@RequestMapping(value = "/403", method = RequestMethod.GET)
public ModelAndView accesssDenied(Principal user) {
ModelAndView model = new ModelAndView();
if (user != null) {
model.addObject("msg", "Hi " + user.getName()
+ ", you do not have permission to access this page!");
} else {
model.addObject("msg",
"You do not have permission to access this page!");
}
model.setViewName("403");
return model;
}
}
完了しました。
注釈ユーザの場合は、この `.exceptionHandling()。accessDeniedPage(”/403 “)`を使用します。
SecurityConfig.java
package com.mkyong.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/** ** ").access("hasRole('ROLE__ADMIN')")
.and().formLogin()
.loginPage("/login").failureUrl("/login?error")
.usernameParameter("username")
.passwordParameter("password")
.and().logout().logoutSuccessUrl("/login?logout")
.and()
.exceptionHandling().accessDeniedPage("/403")
}
}
3. AccessDeniedHandler
さらに、URLを
/403`マッピングに渡す前にカスタムの
AccessDeniedHandler`を作成してビジネスロジックを実行することもできます。
MyAccessDeniedHandler.java
package com.mkyong.web.exception;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
public class MyAccessDeniedHandler implements AccessDeniedHandler {
private String errorPage;
public MyAccessDeniedHandler() {
}
public MyAccessDeniedHandler(String errorPage) {
this.errorPage = errorPage;
}
public String getErrorPage() {
return errorPage;
}
public void setErrorPage(String errorPage) {
this.errorPage = errorPage;
}
@Override
public void handle(HttpServletRequest request, HttpServletResponse response,
AccessDeniedException accessDeniedException)
throws IOException, ServletException {
//do some business logic, then redirect to errorPage url
response.sendRedirect(errorPage);
}
}
httpタグに `ref`を追加してください。
Spring-Security.xml
<http auto-config="true">
<access-denied-handler ref="my403"/>
<intercept-url pattern="/admin** ** " access="ROLE__ADMIN"/>
</http>
<beans:bean id="my403"
class="com.mkyong.web.exception.MyAccessDeniedHandler">
<beans:property name="errorPage" value="403"/>
</beans:bean>
完了しました。
4.デモ
“alex”が `/admin`ページにアクセスしようとすると、上記の403アクセス拒否ページがカスタマイズされます。
4.1 `error-page`を使うとurlは次のように表示されます:

4.2カスタムアクセス拒否ハンドラ `ref`を使用している場合、urlは次のように表示されます:

ソースコードをダウンロードする
ダウンロードする – リンク://wp-content/uploads/2011/08/spring-security-403-access-denied.zip[spring-security-403-access-denied.zip](26 KB)
参考文献
: How to handle HTTP 403 with Spring Security 3.0.x].
http://docs.spring.io/spring-security/site/docs/3.0.8.RELEASE/apidocs/org/springframework/security/web/access/AccessDeniedHandler.html
[Spring
セキュリティ:AccessDeniedHandlerリファレンス]