local highlight.js не работает правильно, как импортированный с удаленного

Java EE 8 и up

Если вы используете Java EE 8 или новее, поместите @RememberMe в пользовательский HttpAuthenticationMechanism а также RememberMeIdentityStore .

@ApplicationScoped
@AutoApplySession
@RememberMe
public class CustomAuthenticationMechanism implements HttpAuthenticationMechanism {

    @Inject
    private IdentityStore identityStore;

    @Override
    public AuthenticationStatus validateRequest(HttpServletRequest request, HttpServletResponse response, HttpMessageContext context) {
        Credential credential = context.getAuthParameters().getCredential();

        if (credential != null) {
            return context.notifyContainerAboutLogin(identityStore.validate(credential));
        }
        else {
            return context.doNothing();
        }
    }
}

public class CustomIdentityStore implements RememberMeIdentityStore {

    @Inject
    private UserService userService; // This is your own EJB.

    @Inject
    private LoginTokenService loginTokenService; // This is your own EJB.

    @Override
    public CredentialValidationResult validate(RememberMeCredential credential) {
        Optional user = userService.findByLoginToken(credential.getToken());
        if (user.isPresent()) {
            return new CredentialValidationResult(new CallerPrincipal(user.getEmail()));
        }
        else {
            return CredentialValidationResult.INVALID_RESULT;
        }
    }

    @Override
    public String generateLoginToken(CallerPrincipal callerPrincipal, Set groups) {
        return loginTokenService.generateLoginToken(callerPrincipal.getName());
    }

    @Override
    public void removeLoginToken(String token) {
        loginTokenService.removeLoginToken(token);
    }

}

Вы можете найти пример реального мира в Java EE Kickoff Application .


Java EE 6/7

Если вы используете Java EE 6 или 7, homegrow - долгоживущий cookie для отслеживания уникального клиента и использования API-интерфейса Servlet 3.0 при условии, что он имеет программный вход HttpServletRequest#login() , когда пользователь не вошел в систему, но файл cookie присутствует.

Это самый простой для достижения, если вы создаете другую таблицу БД со значением java.util.UUID как ПК и идентификатором соответствующего пользователя как FK.

Предположим, что следующая форма входа:

И следующее в doPost() методе Servlet, которое отображается на /login:

String username = request.getParameter("username");
String password = hash(request.getParameter("password"));
boolean remember = "true".equals(request.getParameter("remember"));
User user = userService.find(username, password);

if (user != null) {
    request.login(user.getUsername(), user.getPassword()); // Password should already be the hashed variant.
    request.getSession().setAttribute("user", user);

    if (remember) {
        String uuid = UUID.randomUUID().toString();
        rememberMeService.save(uuid, user);
        addCookie(response, COOKIE_NAME, uuid, COOKIE_AGE);
    } else {
        rememberMeService.delete(user);
        removeCookie(response, COOKIE_NAME);
    }
}

(COOKIE_NAME должно быть уникальным именем cookie, например "remember" и COOKIE_AGE должен быть временем в секундах, например 2592000 в течение 30 дней)

Вот как метод doFilter() для Filter, который отображается на re строковые страницы могут выглядеть так:

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
User user = request.getSession().getAttribute("user");

if (user == null) {
    String uuid = getCookieValue(request, COOKIE_NAME);

    if (uuid != null) {
        user = rememberMeService.find(uuid);

        if (user != null) {
            request.login(user.getUsername(), user.getPassword());
            request.getSession().setAttribute("user", user); // Login.
            addCookie(response, COOKIE_NAME, uuid, COOKIE_AGE); // Extends age.
        } else {
            removeCookie(response, COOKIE_NAME);
        }
    }
}

if (user == null) {
    response.sendRedirect("login");
} else {
    chain.doFilter(req, res);
}

В сочетании с этими вспомогательными методами cookie (слишком плохо они отсутствуют в API сервлета):

public static String getCookieValue(HttpServletRequest request, String name) {
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (name.equals(cookie.getName())) {
                return cookie.getValue();
            }
        }
    }
    return null;
}

public static void addCookie(HttpServletResponse response, String name, String value, int maxAge) {
    Cookie cookie = new Cookie(name, value);
    cookie.setPath("/");
    cookie.setMaxAge(maxAge);
    response.addCookie(cookie);
}

public static void removeCookie(HttpServletResponse response, String name) {
    addCookie(response, name, null, 0);
}

Хотя UUID чрезвычайно сложно использовать грубую силу, вы можете предоставить пользователю возможность заблокировать опцию «запомнить» на IP-адрес пользователя (request.getRemoteAddr()) и сохранить / сравнить его в базе данных. Это делает его еще более надежным.

Также полезно заменить значение UUID, когда пользователь изменил свой пароль.


Java EE 5 или ниже

Пожалуйста, обновите.

-1
задан JawSaw 14 July 2018 в 00:13
поделиться