Spring Security を使用して、resful サーバー リソースの一部を保護し始めました。私のクライアントはリクエストに ajax (jquery ajax) を使用しており、ログイン機能の実装から始めました。
私のジャージー Web レイヤーには次のものが含まれます。
@Path("/login")
@Component
public class LoginResourceProvider extends ServiceResourceProvider {
/*--- Static ---*/
private final static ILogger logger = LogManager.getLogger(LoginResourceProvider.class);
/*--- Members ---*/
@Inject
@Qualifier("authenticationManager")
protected AuthenticationManager authenticationManager;
@Inject
protected SecurityContextRepository repository;
@Inject
protected RememberMeServices rememberMeServices;
/*--- Constructors ---*/
public LoginResourceProvider() {
super("Login");
}
/*--- Public Methods ---*/
@GET
public void login() {
}
/**
* A user login attempt
*
* @param username
* The user name
* @param password
* The password of the given user name
* @param request
* @param response
* @return A JSON string, indicating if the login is successful
*/
@POST
@Produces(MediaType.APPLICATION_JSON)
public String performLogin(@QueryParam("j_username") String username, @QueryParam("j_password") String password,
@Context HttpServletRequest request, @Context HttpServletResponse response) {
// Create a token
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
SecurityContext securityContext = SecurityContextHolder.getContext();
try {
// Attempting to authenticate the user
Authentication auth = authenticationManager.authenticate(token);
// Updating the SecurityContext, which represents the user's
// secured, authenticated session
securityContext.setAuthentication(auth);
// If the user authenticates successfully then the authentication
// storing the security context in the HttpSession between requests
repository.saveContext(securityContext, request, response);
// object is passed to the remember-me service
rememberMeServices.loginSuccess(request, response, auth);
// Successfully authenticated
return "{\"status\": true}";
// Bad Credentials
} catch (BadCredentialsException ex) {
return "{\"status\": false, \"error\": \"Bad Credentials\"}";
}
}
}
私の security-context.xml は今のところ非常に基本的なもので、ログイン プロセスをテストするには十分です。
<http use-expressions="true">
<form-login />
<remember-me />
<intercept-url pattern="/**" access="permitAll" />
<intercept-url pattern="/secured/**" access="isAuthenticated()" />
</http>
<authentication-manager alias="authenticationManager">
<authentication-provider>
<user-service>
<user name="bob" password="bobspassword" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
2 つの質問があります。
それは良い習慣ですか?つまり、そこには ajax スタイルのリクエスト用の「非自動」ログインがたくさん見つかりませんでした。
セキュリティ コンテキストを SecurityContextRepository に保存しようとすると、次の行で例外が発生します。
repository.saveContext(securityContext, リクエスト, レスポンス);
bob をユーザー名と bobspassword パスワードとして使用してログインしようとすると、認証はスムーズに行われますが、この特定の行をデバッグしているときに、次のメッセージで ClassCastException にジャンプしています。
$Proxy31 cannot be cast to org.springframework.security.web.context.SaveContextOnUpdateOrErrorResponseWrapper
どんな助けでも大歓迎です!