Dưới đây là một số mã trả về đối tượng Credential (đối tượng đậu giữ thông tin đăng nhập và mật khẩu).
public Credentials credentialsWithBasicAuthentication(HttpServletRequest req) {
String authHeader = req.getHeader("Authorization");
if (authHeader != null) {
StringTokenizer st = new StringTokenizer(authHeader);
if (st.hasMoreTokens()) {
String basic = st.nextToken();
if (basic.equalsIgnoreCase("Basic")) {
try {
String credentials = new String(Base64.decodeBase64(st.nextToken()), "UTF-8");
LOG.debug("Credentials: " + credentials);
int p = credentials.indexOf(":");
if (p != -1) {
String login = credentials.substring(0, p).trim();
String password = credentials.substring(p + 1).trim();
return new Credentials(login, password);
} else {
LOG.error("Invalid authentication token");
}
} catch (UnsupportedEncodingException e) {
LOG.warn("Couldn't retrieve authentication", e);
}
}
}
}
return null;
}
Nó hoạt động tốt, ngay cả với một mật khẩu như sôi nổi như: & =/é $ £.
Đây là một thử nghiệm cơ bản đơn vị cho lớp, sử dụng JMock:
public void testCredentialsWithBasicAuthentication() {
// Setup
final HttpServletRequest request = context.mock(HttpServletRequest.class);
AuthentificationHelper helper = new AuthentificationHelper();
String login = "mickael";
String password = ":&=/?é$£";
String base64Hash = Base64.encodeString(login + ":" + password);
final String authHeader = "Basic " + base64Hash;
// Expectations
context.checking(new Expectations() {
{
oneOf (request).getHeader("Authorization");
will(returnValue(authHeader));
}
});
// Execute
Credentials credentials = helper.credentialsWithBasicAuthentication(request);
// Verify
assertNotNull(credentials);
assertEquals(login, credentials.getLogin());
assertEquals(password, credentials.getPassword());
context.assertIsSatisfied();
}
Nguồn
2013-08-21 16:50:41
bài servlet của bạn –
tôi chỉ sử dụng mẫu trong liên kết. –
@Roy, ví dụ trong bài đăng của bạn hoạt động tốt cho tôi. Tôi không chắc chắn tại sao nó đưa ra lỗi cho bạn. bạn có thể vui lòng cập nhật bài đăng của mình bằng stacktrace không? –