GlassFish - Realm, może kryptografia [EJB, JPA, JSF]

0

Autoryzacja z pobieraniem loginu i hasła z bazy. Korzystam z tego, co umożliwia mi GlassFish 4. Napotkałem problem, którego nie potrafię wykryć.

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>15</session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>/faces/index.xhtml</welcome-file>
    </welcome-file-list>
    <security-constraint>
        <display-name>Management System - Users</display-name>
        <web-resource-collection>
            <web-resource-name>User Realm</web-resource-name>
            <description/>
            <url-pattern>/faces/user/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <description>Users Pages</description>
            <role-name>user_role</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>
        <display-name>Management System - Admin</display-name>
        <web-resource-collection>
            <web-resource-name>Administrator Realm</web-resource-name>
            <description/>
            <url-pattern>/faces/admin/*</url-pattern>
            <url-pattern>/faces/user/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <description>Admin Pages</description>
            <role-name>admin_role</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>
        <!-- BRAK AUTOMATYCZNEGO PRZEKIEROWANIA NA STRONĘ Z INFORMACJĄ -->
        <display-name>Display - Inactive</display-name>
        <web-resource-collection>
            <web-resource-name>Inactive Realm</web-resource-name>
            <description/>
            <url-pattern>/faces/inactive_account.xhtml</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <description>Inactive Pages</description>
            <role-name>inactive_role</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>DataBaseRealm</realm-name>
        <form-login-config>
            <form-login-page>/faces/sign_in.xhtml</form-login-page>
            <form-error-page>/faces/sign_err.xhtml</form-error-page>
        </form-login-config>
    </login-config>
    <security-role>
        <description/>
        <role-name>admin_role</role-name>
    </security-role>
    <security-role>
        <description/>
        <role-name>user_role</role-name>
    </security-role>
    <security-role>
        <description/>
        <role-name>inactive_role</role-name>
    </security-role>
</web-app>

glassfish-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
  <security-role-mapping>
    <role-name>admin_role</role-name>
    <group-name>admin_role</group-name>
  </security-role-mapping>
  <security-role-mapping>
    <role-name>inactive_role</role-name>
    <group-name>inactive_role</group-name>
  </security-role-mapping>
  <security-role-mapping>
    <role-name>user_role</role-name>
    <group-name>user_role</group-name>
  </security-role-mapping>
  <class-loader delegate="true"/>
  <jsp-config>
    <property name="keepgenerated" value="true">
      <description>Keep a copy of the generated servlet class' java code.</description>
    </property>
  </jsp-config>
</glassfish-web-app>

No i ustawienia Realm'a (załącznik).

Warning: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception - tylko to.

Dodam, że wstawiłem do bazy zakodowany login w SHA-256, skoro taki algorytm zdefiniowałem w GlassFish. Obecnie jednak, przy dodawaniu usera, nie ma jeszcze
metody kodującej. Proszę o wyrozumiałość, robię to pierwszy raz.

0

Nie mogę tego skonfigurować, chyba se w łeb palnę...
wszystko robię dobrze, sprawdzałem z ustawieniami "none" w szyfrowaniu
i też nic, nie wiem o co tu chodzi, pewnie jakaś pierdoła jak zwykle :(

0

Nie wiem co to jest to kodowanie "HEX", ja tam bym wziął base64 (bo to każdy zna :P). W każdym razie na pewno masz źle tabelę "roles", zamiast user_id powinna być kolumna "login", czyli np, tabela "roles" powinna wyglądać tak:

login role_name
jasio admin
zbynio user
itd
Password Encryption Algorithm zostaw na 'none' (nigdy nie mogłem ostatecznie znaleźć do czego to służy)
Ale jakbyś się postarał, to takie rzeczy da się znaleźć w internecie ;)
0

Dziękuje w końcu odpowiedź, tak myślałem, że model danych może być nie taki, choć sądziłem, że to bardziej elastyczne. Trudno mi będzie usunąć ten klucz główny, bo tabela jest powiązana na poziomie encji @SecondaryTables.

@Entity
@SecondaryTables     
(
        {
            @SecondaryTable(name = "roles"),
            @SecondaryTable(name = "workers")
            
        }
)
public class Users implements Serializable
{
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id")
    private Integer userId;
    
    //@Temporal(TemporalType.TIMESTAMP)
    @Column(name = "activation_date", length = 128, unique = false, nullable = true, updatable = true)    
    private String activationDate;
    
    @Column(name = "login", length = 16, unique = true, nullable = false, updatable = false)
    private String login;

    @Column(name = "password", length = 64, unique = false, nullable = false, updatable = true)
    private String password;
    
    @Column(name = "email", length = 48, unique = true, nullable = false, updatable = true)
    private String email;
    
    //TABELA RÓL
    @Column(name = "role_name", length = 16, table = "roles", unique = false, nullable = true, updatable = true)
    private String roleName;
    
    //TABELA DANYCH PERSONALNYCH
    @Column(name = "city", table = "workers", length = 32, unique = false, nullable = true, updatable = true)
    private String city;
    
    @Temporal(TemporalType.DATE)
    @Column(name = "birth_date", table = "workers", unique = false, nullable = true, updatable = true)
    private Date birthDate;
    
    @Column(name = "first_name", table = "workers",  length = 16, unique = false, nullable = true, updatable = true)
    private String firstName;
    
    @Column(name = "last_name", table = "workers",  length = 32, unique = false, nullable = true, updatable = true)
    private String lastName;
    
    @Column(name = "phone_number", table = "workers", length = 16, unique = false, nullable = true, updatable = true)
    private String phoneNumber;
    
    @Column(name = "zip_code", table = "workers", length = 16, unique = false, nullable = true, updatable = true)
    private String zipCode;
    
    @Column(name = "country", table = "workers",  length = 32, unique = false, nullable = true, updatable = true)
    private String country;
    
    @Column(name = "street", table = "workers",  length = 32, unique = false, nullable = true, updatable = true)
    private String street;

Ale może dodam dodatkową kolumnę z loginami. Lub jak rozumiem, w tabeli users, kolumnę z nazwami grup.
Nie, nie jednak przemyślałem to i mam pytanie po co burzyć dawnych model danych? Na pewno da się inaczej to powiązać przy pomocy dwóch tabel.

2

Ja u siebie zrobiłem osobne tabele users i roles w relacji "wiele do wielu" , i tabelę przejściową pomiędzy nimi.
Żeby uzyskać taką postać tabeli jaką podałem (takiej wymaga Glassfish), zrobiłem po prostu widok (postgresql):

CREATE OR REPLACE VIEW users_groups_view AS 
 SELECT u.username, g.groupname
   FROM users u
   JOIN groups_users ug ON u.id = ug.user_id
   JOIN groups g ON g.id = ug.group_id;

users:

id username password
groups:
id groupname
---------------- ----------------
groups_users:
user_id group_id
---------------- ----------------

ale nie wiem czy mysql obsługuje już widoki ]:> :D

1e7cc31551.png

0

Zrobiłem to beznadziejne logowanie, wszystko działa ładnie odkodowuje mi hasła, no ale niestety model danych uległ zmianie, co mnie nieco irytuje. Pola do wypełnienia w konfiguracji Glassfish sugerowały różne tabele. Zdaje się, że to nie błąd ze strony dostarczyciela narzędzia tylko do diabła chodziło pewnie o te obsikane relacje. Tabela users nie wie nic o tabeli roles, niby w encjach połączyłem te tabele ale na poziomie baz było nie tak jak trzeba.

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