Witam, piszę aplikację z wykorzystaniem EJB, JPA oraz JSF. Do zapewnienia bezpieczeństwa jak i obsługą logowania wykorzystałem jdbcRealma-a. Wszytko działa jedynie problem pojawia się gdy chcę sprawdzić prawa użytkownika. Ale po kolei, korzystam z 3 ról userów:
web.xml
<security-role>
<description/>
<role-name>ADMIN</role-name>
</security-role>
<security-role>
<description/>
<role-name>USER</role-name>
</security-role>
<security-role>
<description/>
<role-name>EMPLOYEE</role-name>
</security-role>
sub-web.xml
<security-role-mapping>
<role-name>ADMIN</role-name>
<group-name>ADMIN</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>USER</role-name>
<group-name>USER</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>EMPLOYEE</role-name>
<group-name>EMPLOYEE</group-name>
</security-role-mapping>
pobranie nicku aktualnie zalogowanego user-a
public String getUserName() {
String usern = "";
List<User> u = null;
if (user == null) {
Principal principal = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
if (principal != null) {
u = this.find(principal.getName());
}
}
usern = u.get(0).getUsername();
return usern;
}
i na koniec prosta metoda do sprawdzania praw
public int checkLaws() {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
if (request.isUserInRole("ADMIN")) {
return laws = 3;
} else if (request.isUserInRole("EMPLOYEE")) {
return laws = 2;
} else if (request.isUserInRole("USER")) {
return laws = 1;
} else { // UNLOGGED
return laws = 0;
}
}
Otóż wymyśliłem sobie, że 'nie odpowiednie' linki będę ukrywał za pomocą atrybuty rendered.
<h:commandLink value="#{msg.logout}" action="#{user.logoutAction}" rendered="#{user.checkLaws > 0}" />
niestety powyższy sposób nie ma prawa zadziałać :( .
Drugim sposobem jaki próbowałem było wykorzystanie JS i ukrytego h:commandButton-a odpowiedzialnego za wywołanie metody user.checkLaws
Funkcja JS
<script type="text/javascript">
function invokeMethod(){
document.getElementById('userOpt:checkUser').click();
}
</script>
wywołanie funkcji podczas ładowania <body>
<body onload="invokeMethod();">
ukryty button oraz sprawdzenie praw
<h:commandButton action="#{user.checkLaws}" id="checkUser" style="display: none"/>
<h:commandLink value="#{msg.login}" action="#{user.showMessage}" rendered="#{user.laws == 0}">
<f:param name="message" value="login_form"/>
</h:commandLink><br />
Ten sposób powoduje permanentne odświeżanie się strony index.jsp oraz uniemożliwia wykonanie jakiejkolwiek akcji. Ma ktoś pomysł jak rozwiązać ten problem ?