私のアプリケーションは Spring Security を使用しており、クライアントには以下が必要です。
- ユーザーは、サインアップ後に自動的にログインできるようになります。
- 管理者はパスワードを知らなくても任意のユーザーとしてログインできます。
そのため、パスワードを知らなくても任意のユーザーとして自動的にログインする方法を理解する必要があります。
Spring Security を使用してこれをどのように達成できますか?
私のアプリケーションは Spring Security を使用しており、クライアントには以下が必要です。
そのため、パスワードを知らなくても任意のユーザーとして自動的にログインする方法を理解する必要があります。
Spring Security を使用してこれをどのように達成できますか?
これを機能させるには、次のことを行う必要がありました。
UserDetailsService (jdbcUserService) への参照を構成する
<authentication-manager>
<authentication-provider>
<jdbc-user-service id="jdbcUserService" data-source-ref="dataSource"
users-by-username-query="select username,password, enabled from users where username=?"
authorities-by-username-query="select u.username, ur.authority from users u, user_roles ur where u.user_id = ur.user_id and u.username =? "
/>
</authentication-provider>
</authentication-manager>
コントローラーで userDetailsManager を自動配線します。
@Autowired
@Qualifier("jdbcUserService") // <-- this references the bean id
public UserDetailsManager userDetailsManager;
同じコントローラーで、次のようにユーザーを認証します。
@RequestMapping("/automatic/login/test")
public @ResponseBody String automaticLoginTest(HttpServletRequest request)
{
String username = "anyUserName@YourSite.com";
Boolean result = authenticateUserAndInitializeSessionByUsername(username, userDetailsManager, request);
return result.toString();
}
public boolean authenticateUserAndInitializeSessionByUsername(String username, UserDetailsManager userDetailsManager, HttpServletRequest request)
{
boolean result = true;
try
{
// generate session if one doesn't exist
request.getSession();
// Authenticate the user
UserDetails user = userDetailsManager.loadUserByUsername(username);
Authentication auth = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);
}
catch (Exception e)
{
System.out.println(e.getMessage());
result = false;
}
return result;
}
アプリにSpring Securityを使用するだけの良い前兆がここにあることに注意してください。