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() {
}
}
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.
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]}
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