JSF: jak kontrolować dostęp i prawa w JSF?

Chciałbym kontrolować dostęp po zalogowaniu się użytkownika do mojego systemu.

Na przykład:

administrator : can add, delete and give rights to employee
employee : fill forms only
...

Więc po tym, jakie prawo ma użytkownik, sprawdzając w bazie danych, chciałbym ograniczyć to, co ten użytkownik może zobaczyć i zrobić. Jest na to prosty sposób ?

EDIT

@WebFilter("/integra/user/*")
public class LoginFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {    
        HttpServletRequest req = (HttpServletRequest) request;
        Authorization authorization = (Authorization) req.getSession().getAttribute("authorization");

        if (authorization != null && authorization.isLoggedIn()) {
            // User is logged in, so just continue request.
            chain.doFilter(request, response);
        } else {
            // User is not logged in, so redirect to index.
            HttpServletResponse res = (HttpServletResponse) response;
            res.sendRedirect(req.getContextPath() + "/integra/login.xhtml");
        }
    }

    // You need to override init() and destroy() as well, but they can be kept empty.


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {
    }
}
Author: Valter Silva, 2012-09-20

1 answers

To dość obszerny temat. Jak zaczynasz z homebrewed uwierzytelniania, będę kierować odpowiedź na homebrewed autoryzacji.


Sprawdzanie ról w Javie / JSF jest samo w sobie stosunkowo proste, jeśli model jest rozsądnie zaprojektowany. Zakładając, że pojedynczy użytkownik może mieć wiele ról (jak to często ma miejsce w rzeczywistych aplikacjach), ostatecznie chciałbyś mieć coś w stylu: {]}
public class User {

    private List<Role> roles;

    // ...

    public boolean hasRole(Role role) {
        return roles.contains(role);
    }

}
public enum Role {

    EMPLOYEE, MANAGER, ADMIN;

}

Tak, że można to sprawdzić w następujący sposób w JSF odsłon:

<h:selectManyCheckbox value="#{user.roles}" disabled="#{not user.hasRole('ADMIN')}">
    <f:selectItems value="#{Role}" />
</h:selectManyCheckbox>
<h:commandButton value="Delete" rendered="#{user.hasRole('ADMIN')}" />

I w filtrze:

String path = req.getRequestURI().substring(req.getContextPath().length());

if (path.startsWith("/integra/user/admin/") && !user.hasRole(Role.ADMIN)) {
    res.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}

Najtrudniejszą częścią jest przełożenie tego modelu Javy na zdrowy model DB. Istnieje kilka różnych sposobów w zależności od konkretnych wymagań biznesowych, każdy z własnymi (dis)zalety. A może masz już model DB, na którym musisz oprzeć swój model Javy (dlatego musisz projektować oddolnie)?

W każdym razie, zakładając, że używasz JPA 2.0 (Twoja historia pytań przynajmniej to potwierdza) i że możesz projektować odgórnie, jednym z najprostszych sposobów byłoby odwzorowanie właściwości roles jako @ElementCollection przeciwko tabeli user_roles. Ponieważ używamy Role enum, druga role tabela nie jest konieczna. Ponownie, to zależy od konkretnych wymagań funkcjonalnych i biznesowych.

W języku SQL, tabela user_roles może wyglądać następująco:
CREATE TABLE user_roles (
    user_id BIGINT REFERENCES user(id),
    role VARCHAR(16) NOT NULL,
    PRIMARY KEY(user_id, role)
)

Który następnie należy odwzorować w następujący sposób:

@ElementCollection(targetClass=Role.class, fetch=FetchType.EAGER)
@Enumerated(EnumType.STRING)
@CollectionTable(name="user_roles", joinColumns={@JoinColumn(name="user_id")})
@Column(name="role")
private List<Role> roles;

To w zasadzie wszystko, co musisz zmienić w swoim User / align = "left" /


Obok homebrewed authentication (Logowanie/wylogowanie) i authorization (sprawdzanie roli), istnieje również Java EE provided container managed authentication za pomocą którego można zalogować się przez j_security_check lub HttpServletRequest#login(), filtruj żądania HTTP przez <security-constraint> w web.xml, sprawdź zalogowanego użytkownika przez #{request.remoteUser} i jego role przez #{request.isUserInRole('ADMIN')}, itd.

Następnie istnieje kilka frameworków stron trzecich, takich jak PicketLink, Wiosna Bezpieczeństwo, Apache Shiro , itd. Ale to wszystko nie wchodzi w rachubę:) [21]}

 31
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-26 09:14:20