Как ограничить доступ незарегистрированных пользователей к определенным страницам?(JSF 2.0) - PullRequest
2 голосов
/ 14 апреля 2011

Я реализую свой собственный механизм аутентификации, и я хочу знать, правильно ли то, что я делаю, и если нет, то как я могу сделать это правильно.

Сначала расскажу, как работает мой механизм аутентификации:

-Данные моих пользователей находятся внутри объекта под названием Роль. Этот объект содержит 3 поля:

Адрес электронной почты: String

пароль: String

UserType: Enum

-При доступе пользователя к системе роль объекта сохраняется в сеансе.

У меня вопрос: как я могу ограничить доступ к определенным страницам для пользователей (роль) на основе их полей userType?

Это то, что я делаю, но не работает.

Сначала у меня есть управляемый компонент, который проверяет, зарегистрирован ли usser.

@ManagedBean
@RequestScoped
public class SecurityController {

    //Some attributes...


    public String redirectNotBuyer() {
        Role role = (Role) FacesContext.getCurrentInstance()
                .getExternalContext().getSessionMap().get("userRole");
        //Checks if user is logged
        if (role == null) {         
            // Please login
            //Add message to authentification
            return "login.xhtml";           
        } else if (role != null) {
            if (!role.getType().toString().equalsIgnoreCase("BUYER")) {
                // Buyer not authorized
                return "main.xhtml";
            }
        }       
        return null;
    }

    public String redirectNotSeller() {
        Role role = (Role) FacesContext.getCurrentInstance()
                .getExternalContext().getSessionMap().get("userRole");
        if (role == null) {
            // Please login
            //Add message to authentification
            return "login.xhtml";           
        } else if (role != null) {
            if (!role.getType().toString().equalsIgnoreCase("SELLERs")) {
                // Buyer not authorized
                return "main.xhtml";
            }
        }       
        return null;
    }

//Getters, setters...

Перечисленные выше два метода перенаправляются в случае, если пользователь не является Покупателем, а в случае, если пользователь не является продавцом.

Так что теперь я делаю на странице, на которую я не хочу, чтобы пользователь заходил, я вызываю один из этих методов, поэтому пользователь перенаправляется на главную страницу. Пример: не авторизованный пользователь входит на страницу с именем buyOffer.xhtml, доступ к которой имеют только ПОКУПАТЕЛИ:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">


<ui:composition template="WEB-INF/templates/BasicTemplate.xhtml">
    <!-- THE REGISTRATION FORM -->
    <ui:define name="buyOfferForm">
       <h2>Buy offer</h2>
       #{SecurityController.redirectNotBuyer()}
    </ui:define>            
</ui:composition>

</html>

По какой-то причине, когда я захожу на эту страницу с не авторизованным пользователем или пользователем, у которого нет BUYER в качестве userType, он не перенаправляется на страницу main.xhtml. Почему это так?

1 Ответ

5 голосов
/ 14 апреля 2011

Правильным механизмом было бы использование Filter.

См.

...