Как реализовать выход при использовании безопасности на основе форм - PullRequest
5 голосов
/ 24 ноября 2011

Я использую область безопасности на основе форм JDBC и хочу реализовать выход из системы, но когда я нажимаю на ссылку, я вижу следующее исключение:

java.lang.RuntimeException: java.security.AccessControlException: доступ запрещен (java.lang.reflect.ReflectPermission suppressAccessChecks) ... Причина: java.security.AccessControlException: доступ запрещен (java.lang.reflect.ReflectPermission suppressAccessChecks)

* 1006EJB, который я создал для выхода из системы:
@Stateless(name = "ejbs/SessionSupportEJBImpl")
@DeclareRoles({"administrators","users"})
public class SessionSupportEJBImpl implements SessionSupportEJB {

    @PermitAll
    public void releaseUserState() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
                .getExternalContext().getSession(false);
        if (session != null) {
            session.invalidate();
        }
    }
}

Здесь я вызываю его из поддерживающего компонента:

@Named("logoutBB")
@RequestScoped
public class LogoutBean {

    @EJB
    private SessionSupportEJB sessionSupportEJB;

    public String logout() {
        sessionSupportEJB.releaseUserState();
        return "index.xhtml?faces-redirect=true";
    }
}

А вот разметка, которая должна его вызывать:

<h:form>
        <h:commandLink value="LOGOUT" action="#{logoutBB.releaseUserState}"/>
    </h:form>

Мои сомнения:

  • Как работает функция выхода из системы?

  • Обязательно ли всегда использовать аннотации безопасности ejbs на моих EJB для разрешения доступа? (При использовании области безопасности)

  • Следуетя делаю это с сервлетом вместо EJB?

  • Это неправильный подход, должен ли я попробовать что-то еще для выхода из системы?

1 Ответ

5 голосов
/ 24 ноября 2011

Во-первых, я рекомендую не вызывать FacesContext в EJB, потому что FacesContext является элементом «View Layer».Цель EJB - представить «слой логики бизнеса», и лучшая практика состоит в том, чтобы изолировать бизнес-логику от de View, потому что вы можете получить доступ к логике бизнеса из многих типов представлений.

О том, как закрытьсеанс, я предлагаю сделать следующее:

Создать сервлет и реализовать метод doGet, чтобы закрыть сеанс следующим образом:

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
        HttpSession session= req.getSession();
        session.invalidate();
        RequestDispatcher rd = req.getRequestDispatcher("/login.xhtml"); //The url where go after logout
        rd.forward(req,res);
  }
}

Таким образом, вы можете добавить следующую ссылку в васhtml / xhtml страницы для выхода из системы:

<a href="/logout">Logout</a>

Если вы используете JSF, для получения пути к контексту своего приложения вы можете использовать:

<a href="${request.contextPath}/logout">Logout</a>

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я предполагаючто вы используете Java EE 6. Также я не тестировал код (но я знаю, что он работает), если у вас есть проблемы с компиляцией, пожалуйста, сообщите мне

...