[JEE] Wywołanie metody z bean-a, problem

0

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 ?

0

A jeżeli zamiast
rendered="#{user.checkLaws > 0}"
dasz
rendered="#{user.checkLaws() > 0}"
to nie zadziała?

Jboss Seam, który jest oparty na JSF (ale ma trochę inny EL) by to obsłużył.

0

działa

wielkie dzięki, sam nie wiem jak na to nie wpadłem ;) chyba to przez to że po części wyłączyłem myślenie i skupiałem się tylko i wyłącznie na podpowiedziach NetBeansa

pozdrawiam </image>

1 użytkowników online, w tym zalogowanych: 0, gości: 1