5 Stimmen

Login nicht ausgelöst für eingeschränkte Seite in Glassfish jdbcrealm Authentifizierung

Ich bin sehr neu im Bereich der EJB-Sicherheit und des GlassFish-Authentifizierungs- und Autorisierungsmechanismus. Ich habe eine jdbc Bereich und konfiguriert sun-web.xml y web.xml um die Rollen zuzuordnen und den Zugriff auf eine Seite zu beschränken.

Mein Problem ist jedoch, dass, wenn ich den Zugriff auf alle Seiten zu beschränken, es funktioniert und löst die Login-Pop-up vor dem Laden der Willkommensseite (mit BASIC-Authentifizierung).

<web-resource-collection>
  <web-resource-name>All Pages</web-resource-name>
  <description/>
  <url-pattern>/*</url-pattern>
  <http-method>GET</http-method>
  <http-method>POST</http-method>
  <http-method>HEAD</http-method>
  <http-method>PUT</http-method>
  <http-method>OPTIONS</http-method>
  <http-method>TRACE</http-method>
  <http-method>DELETE</http-method>
</web-resource-collection>

aber wenn ich den Zugriff auf eine Seite in einem Ordner beschränke security fragt GlassFish nicht nach der Anmeldung und leitet den Benutzer auf die eingeschränkte Seite um.

<web-resource-collection>
  <web-resource-name>All Pages</web-resource-name>
  <description/>
  <url-pattern>/security/*</url-pattern>
  <http-method>GET</http-method>
  <http-method>POST</http-method>
  <http-method>HEAD</http-method>
  <http-method>PUT</http-method>
  <http-method>OPTIONS</http-method>
  <http-method>TRACE</http-method>
  <http-method>DELETE</http-method>
</web-resource-collection>`

Bitte helfen Sie mir, dieses Problem zu lösen Vielen Dank im Voraus.

Ich fand auch diese Einträge, nachdem ich den Sicherheitsmanager aktiviert hatte

Processing login with credentials of type: class com.sun.enterprise.security.auth.login.PasswordCredential
Logging in user [admin] into realm: admin-realm using JAAS module: fileRealm
Login module initialized: class com.sun.enterprise.security.auth.login.FileLoginModule
File login succeeded for: admin
JAAS login complete.
JAAS authentication committed.
Password login succeeded for : admin
permission check done to set SecurityContext
Set security context as user: admin

[Web-Security] hasResource perm: (javax.security.jacc.WebResourcePermission /faces/security/UserRedirect.jsp GET)

es scheint, wie Admin-Prinzipal in Admin-Realm automatisch authentifiziert und für meine Anwendung verwendet wird, anstatt meine Jdbcrealm zu verwenden. Irgendwelche Ideen, wie man das beheben kann?

Update

Es tut mir leid, ich habe gerade die Authentifizierung in ein Formular zur Überprüfung geändert. Ich habe sie wieder auf BASIC zurückgestellt. Und ja, ich habe den Namen jdbcrealm als Standard-Realm.

Sie haben Recht genau das ist es.

GlassFish leitet nicht auf die Seite des Anmeldeformulars um und der Zugriff auf eingeschränkte Ressourcen ist nicht eingeschränkt

Ich denke, dass es daran liegt, dass der Admin-Realm-Admin automatisch authentifiziert wird, und wenn ich versuche, auf eine eingeschränkte Seite zuzugreifen, wird der authentifizierte Benutzer überprüft, und da es sich um den Admin handelt und er die Berechtigung für die Seite hat, ist die Seite zugänglich und fordert nicht zur Anmeldung auf.

Diese erscheinen immer noch, wenn ich die Anwendung ausführe und nicht versuche, mich bei der Verwaltungskonsole von glass fish anzumelden

Processing login with credentials of type: class com.sun.enterprise.security.auth.login.PasswordCredential
Logging in user [admin] into realm: admin-realm using JAAS module: fileRealm
Login module initialized: class com.sun.enterprise.security.auth.login.FileLoginModule
File login succeeded for: admin
JAAS login complete.
JAAS authentication committed.
Password login succeeded for : admin
permission check done to set SecurityContext
Set security context as user: admin

Auch diese

(unresolved javax.security.jacc.WebUserDataPermission /security/* null)
 (unresolved javax.security.jacc.WebUserDataPermission /:/security/* null)
 (unresolved com.sun.corba.ee.impl.presentation.rmi.DynamicAccessPermission access null)
 (unresolved javax.security.jacc.WebResourcePermission /:/security/* null)
 (unresolved javax.security.jacc.WebResourcePermission /security/* !DELETE,GET,HEAD,OPTIONS,POST,PUT,TRACE)
 (unresolved com.sun.enterprise.security.CORBAObjectPermission * *)

Aktualisierung 2

Ich habe es mit <url-pattern>/*</url-pattern> anstelle von <url-pattern>/security/*</url-pattern>

und interessanterweise ist das, was ich in der Spur erhalten habe.

Processing login with credentials of type: class com.sun.enterprise.security.auth.login.PasswordCredential
Logging in user [employee] into realm: emsSecurity using JAAS module: jdbcRealm
Login module initialized: class com.sun.enterprise.security.auth.login.JDBCLoginModule
JDBC login succeeded for: employee groups:[Ljava.lang.String;@16bfca4
JAAS login complete.
JAAS authentication committed.
Password login succeeded for : employee
permission check done to set SecurityContext
Set security context as user: employee

und es wird eine Seite mit verweigertem Zugriff angezeigt.

HTTP Status 403 - Der Zugriff auf die angeforderte Ressource wurde verweigert'.

Ich verstehe nicht, wie Glassfish den Benutzer-Mitarbeiter authentifiziert, ohne dass der Benutzer die Anmeldedaten eingibt. Es wird sogar angezeigt: "Passwortanmeldung erfolgreich für: Mitarbeiter". Bitte helfen Sie mir, dieses Problem zu lösen.


Zunächst einmal herzlichen Dank für Ihre Bemühungen. Ich bin immer noch mit dem Problem stecken. Ich poste hier die Xml-Dateien.

sun-web.xml

<security-role-mapping>
<role-name>Employee</role-name>
<group-name>Employee</group-name>

web.xml

    <security-constraint>
    <display-name>Login Constraint</display-name>
    <web-resource-collection>
        <web-resource-name>User Redirect page</web-resource-name>
        <description/>
        <url-pattern>/security/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
        <http-method>HEAD</http-method>
        <http-method>PUT</http-method>
        <http-method>OPTIONS</http-method>
        <http-method>TRACE</http-method>
        <http-method>DELETE</http-method>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>Employee</role-name>
        </auth-constraint>
    </security-constraint>
<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>deliverySecurity</realm-name>
    <form-login-config>
        <form-login-page>/Login.jsp</form-login-page>
        <form-error-page>/index.jsp</form-error-page>
        </form-login-config>
    </login-config>
<security-role>
    <description/>
    <role-name>Employee</role-name>
</security-role>

Außerdem gibt es keinen Stack-Trace. Keine Ausnahme.. Der Benutzer wird einfach auf die gesicherte Seite umgeleitet, als ob es keine Authentifizierungsanforderungen gäbe. Dies ist ein jsf visuelles Webentwicklungsprojekt mit Netbeans 6.5.1 und Glassfish v2. Vielen Dank!

0 Stimmen

Welche Version von Glassfish läuft bei Ihnen? Klicken Sie in der Verwaltungskonsole auf "Version".

3voto

André Punkte 434

Versuchen Sie, dem Url-Muster "/faces" hinzuzufügen. Zum Beispiel: /faces/security/*

2voto

Pascal Thivent Punkte 548176

Könnten Sie bitte alle relevanten Teile Ihrer web.xml denn ich habe einen Test mit diesem web.xml :

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <display-name>Archetype Created Web Application</display-name>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Protected Area</web-resource-name>
      <url-pattern>/jsp/security/protected/*</url-pattern>
      <http-method>PUT</http-method>
      <http-method>DELETE</http-method>
      <http-method>GET</http-method>
      <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
      <role-name>role1</role-name>
    </auth-constraint>
  </security-constraint>

  <!-- Security roles referenced by this web application -->
  <security-role>
    <role-name>role1</role-name>
  </security-role>
  <login-config>
    <auth-method>BASIC</auth-method>
  </login-config>
</web-app>

Und das Anfordern einer geschützten Ressource ( http://localhost:8080/mywebapp/jsp/security/protected/ hier) fordert mich zur Eingabe eines Benutzernamens und eines Passworts auf. Mit anderen Worten, ich kann das Problem nicht reproduzieren (ich habe GlassFish v3 verwendet).

Aktualisierung: Ich habe die Sicherung meiner Beispiel-Webapp mit einer jdbc Bereich und bestätigen Sie, dass alles einwandfrei funktioniert. Also, wie gesagt, bitte geben Sie Ihre web.xml und Ihr sun-web.xml . Setzen Sie außerdem die Protokollierungsstufe aus Sicherheitsgründen auf FINEST:

alt text

Und verbinden Sie relevante Spuren.

Aktualisierung: Ich denke, die von Ihnen gezeigten Spuren sind für die Anmeldung des admin Benutzer in der Verwaltungskonsole. Wenn nicht, haben Sie den jdbc-Realm als Standard-Realm festgelegt ( Datenbank ist mein jdbc realm in der folgenden Aufnahme)?

alt text

Übrigens, ich dachte, Sie verwenden die BASIC-Authentifizierung. Aber laut der von Ihnen angegebenen Beschreibung verwenden Sie FORM. Könnten Sie also klarstellen, was Sie tatsächlich verwenden und was genau das Problem ist (z. B: "GlassFish leitet nicht auf die Seite des Anmeldeformulars um und der Zugriff auf eingeschränkte Ressourcen ist nicht eingeschränkt")?

1voto

André Punkte 434

Zwei mögliche Lösungen:

1 - Haben Sie es mit einem anderen Browser versucht? Denn die Anmeldeinformationen können zwischengespeichert Wenn Sie also einmal getippt haben, werden Sie erst wieder gefragt, wenn Sie sich abmelden.

2 - Einführung eines Logout-Methode . Ich verwende JSF 2.0 und meine Logout-Methode ist so etwas wie dieses:

public String logout() {
        FacesContext context = FacesContext.getCurrentInstance();

        // remove data from beans:
        for (String bean : context.getExternalContext().getSessionMap().keySet()) {
            context.getExternalContext().getSessionMap().remove(bean);
        }

        // destroy session:
        HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
        session.invalidate();

        // using faces-redirect to initiate a new request:
        return "/security/index.xhtml?faces-redirect=true";

    }

Sie können versuchen, diese Methode zu Ihrer Bean hinzuzufügen und sie dann über eine Schaltfläche mit ' action="#{IhreBean.logout}" '.

Wenn Sie dann Ihren Browser aktualisieren, werden Sie zur Eingabe Ihrer Anmeldedaten aufgefordert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X