(Spring Security/MVCで)ページへのアクセスが拒否された場合、ユーザーが十分な特権を持っていない(彼は認証されていますが)ので、ログインページ(403アクセス拒否ページを表示する標準的な動作ではなく)。
AccessDeniedHandler
と書くと、ログインページにリダイレクトされます。しかし、Spring Securityは、別のユーザがログインしていることがわかった場合、どのように反応しますか?新しいユーザーが正常に認証されたら、古いユーザーを何とかログアウトできますか?ログインページにリダイレクトされたAccessDeniedHandler
答えて
すでにログインしている別のユーザーがいるときに新しいユーザーにログインしようとしました。最初のユーザーをログアウトせずに動作します。彼の許可は新しいものに置き換えられます。これは私自身の質問に対する簡単な答えです。アクセスの場合はログインページに転送する方法を
誰かが興味を持っている場合は、拒否されました - ここに私のソリューションです:
まず、カスタムRequestCacheを定義します。
@Component("myRequestCache")
public class MyRequestCache extends HttpSessionRequestCache {
public MyRequestCache() {
super();
}
}
第二には、カスタムAccessDeniedHandlerを定義します。
@Component("myAccessDeniedHandler")
public class MyAccessDeniedHandler implements AccessDeniedHandler {
@Autowired
@Qualifier("myRequestCache")
private RequestCache myRequestCache;
public MyAccessDeniedHandler() {
}
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exc)
throws IOException, ServletException {
if (!response.isCommitted()) {
//Save Target-Request
shopRequestCache.saveRequest(request, response);
//Forward to the login page
request.getRequestDispatcher("/loginPage").forward(request, response);
}
}
}
サード春のセキュリティにこれら二つを設定します。
@Configuration
@EnableWebSecurity
public class myConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("myRequestCache")
RequestCache myRequestCache;
@Autowired
@Qualifier("myAccessDeniedHandler")
AccessDeniedHandler myAccessDeniedHandler;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.requestCache()
.requestCache(myRequestCache)
.and()
.exceptionHandling()
.accessDeniedHandler(myAccessDeniedHandler)
}
}
ここで何が起こっているか
AccessDeniedException
の場合、MyAccessDeniedHandler
がログインページに転送されます。このフォワードは、フィルタチェーン内のSpringではなく、この自己プログラミングされたクラスによって呼び出されるため、目的のリクエストが何であるかを春に伝えなければなりません。これはRequestCache
で行います。
古いユーザーをログアウトしたい場合は、私はSessionRegistry
(http://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/core/session/SessionRegistry.html)を使用してお勧めし
いくつかのヒント:あなたのAccessDeniedHandler
でSpring構成クラスで
@Configuration
class MyConfiguration{
@Bean
public SessionRegistry sessionRegistry() {
return new SessionRegistryImpl();
}
}
:
@Autowired
private SessionRegistry sessionRegistry;
....
List<SessionInformation> sessionInformations = sessionRegistry.getAllSessions("an-user", false);
for(SessionInformation session: sessionInformations) {
session.expireNow();
}
あなたの春のセキュリティのxml
ファイルのタグに続く。
<http auto-config="true" use-expressions="true">
<access-denied-handler error-page="/accessDenied" />
<intercept-url pattern="/publicIndex1" access="isAnonymous()"/>
<intercept-url pattern="/index1" access="isAnonymous()"/>
<!-- Restrict URLs based on role -->
<intercept-url pattern="/#/publicIndex" access="isAnonymous()" />
<form-login
login-page="/publicIndex1"
always-use-default-target="false"
default-target-url="/index"
authentication-failure-url="/publicIndex1"
username-parameter="username"
password-parameter="password" />
<logout logout-success-url="/index1"
delete-cookies="JSESSIONID"
logout-url="/logout"
invalidate-session="true" />
</http>
スプリングコントローラでは、
@RequestMapping(value = "/accessDenied", method = RequestMethod.GET)
public ModelAndView accessDenied() {
System.out.println("access denied page call");
return new ModelAndView("accessDenied");
}
@RequestMapping(value = "/#/publicIndex", method = RequestMethod.GET)
public ModelAndView login(@RequestParam(value = "error", required = false) String error,
@RequestParam(value = "logout", required = false) String logout) {
System.out.println("inside /#/public index");
ModelAndView model = new ModelAndView();
if (error != null) {
model.addObject("error", "Invalid username and password!");
}
System.out.println("**********************" + error);
if (logout != null) {
model.addObject("msg", "You've been logged out successfully.");
}
model.setViewName("publicIndex");
return model;
}
@RequestMapping(value = "/logout", method = RequestMethod.GET)
public String logout1() {
System.out.println();
User user1 = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return userService.addUserOffline(user1.getUserId());
}
@RequestMapping(value = "/index", method = RequestMethod.GET)
public ModelAndView index() {
System.out.println("Redirect Controller Call");
User user = new User();
try {
user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
} catch (Exception e) {
return new ModelAndView("publicIndex1");
}
long userId = user.getUserId();
userService.addLastLoginDate(userId);
System.out.println("user id==" + userId);
return new ModelAndView("index");
}
@RequestMapping(value = "/index1", method = RequestMethod.GET)
public ModelAndView index1() {
System.out.println("inside logout index1");
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (!(auth instanceof AnonymousAuthenticationToken)) {
return new ModelAndView("/index");
} else {
return new ModelAndView("index1");
}
}
ありがとうございます - しかし、これは私の質問に答えることはできません、Springがどのように反応し、誰かがログインしている場合にログインする方法 - ログアウトなしで動作するかどうか - ログインページと認証のコミット後にこのログアウトを実行する方法プロセス。私はこの質問への簡単な答えを見つけました:) - 私が書いたものを見てください。 – olivmir
- 1. ionic - ログインページがメインページにリダイレクトされない
- 2. casがログインページにリダイレクトされない
- 3. phpログインページにリダイレクトされません
- 4. 成功したログインはログインページにリダイレクトされます
- 5. angularJS指定されたURLではなくログインページにリダイレクト
- 6. 閉鎖されたユーザーグループは、指定されたログインページにリダイレクトしません。
- 7. Symfony + Angular:ログインページにリダイレクト
- 8. BadCredentialsExceptionがスローされ、ログインページにリダイレクトされない
- 9. ユーザーアカウントがロックされているとロックされたメッセージでログインページにリダイレクト
- 10. ログインページからリダイレクト
- 11. yii2ログインページのリダイレクトがキャンセルされた状態でループする
- 12. ログアウト時にログインページにリダイレクト
- 13. ASP.NET Azure webappは頻繁にログインページにリダイレクトされます
- 14. asp.net mvcページが数日後にログインページにリダイレクトされる
- 15. PHP cURLがログインページにリダイレクト
- 16. ajaxリクエストのログインページにリダイレクト
- 17. IFrameからログインページにリダイレクト
- 18. ASP.Netログインページにリダイレクトする
- 19. Mvc 3ログインページのリダイレクト
- 20. net :: ERR_INCOMPLETE_CHUNKED_ENCODINGリダイレクトWPログインページ
- 21. symfonyセッションの有効期限が切れた後にログインページにリダイレクト
- 22. auth0エラー - ログイン後、ログインページにリダイレクトされます
- 23. ログインページがFirefoxのログイン後にリダイレクトされない5
- 24. Laravel - ログインページはホームページにリダイレクトされますが、生産時のみ
- 25. JDBCRealmフォームベースの認証がログインページにリダイレクトされない
- 26. Laravel Passportルートはログインページにリダイレクトされます
- 27. 好きなボタンがログインページにリダイレクトされる
- 28. セッションタイムアウトがGWTプロジェクトのログインページにリダイレクトされる場合
- 29. Sitecoreは認証後もログインページにリダイレクトされます
- 30. ログインページにリダイレクトされないモーダル認証(ログインページiFrameまたはオブジェクトとして)の要件はありますか?
ありがとうございます - 私が質問したのは、すでに誰かがログインしているとログインすると、どのように反応するのですか?ログアウトなしでも動作しますか?いいえ、ログインページのコミット後にこのログアウトを実行する方法認証プロセス。私はこの質問への簡単な答えを見つけました:) - 私が書いたものを見てください。 – olivmir