Аутентификация Oracle + Spring Security: SQLException: недопустимый индекс столбца - PullRequest
0 голосов
/ 13 мая 2011

Я использую Spring MVC + Security и Oracle 10g. При попытке аутентификации я получаю следующую ошибку:

Error : PreparedStatementCallback; invalid ResultSet access for SQL [SELECT PAYGATEMANAGER.AUTHENTICATION_PKG.getUser(?) FROM DUAL]; nested exception is java.sql.SQLException: Invalid column index 

security.xml:

<authentication-manager>
    <authentication-provider>
        <jdbc-user-service data-source-ref="dataSource"
            users-by-username-query=
                "SELECT PAYGATEMANAGER.AUTHENTICATION_PKG.getUser(?) FROM DUAL"
            authorities-by-username-query=
                "SELECT PAYGATEMANAGER.AUTHENTICATION_PKG.getAuthorities(?) FROM DUAL" />
    </authentication-provider>
</authentication-manager>

PL / SQL:

CREATE OR REPLACE PACKAGE PAYGATEMANAGER.AUTHENTICATION_PKG AS
TYPE T_REFCURSOR IS REF CURSOR;

  FUNCTION getUser(username IN VARCHAR2) RETURN T_REFCURSOR;  
  FUNCTION getAuthorities(username IN VARCHAR2) RETURN T_REFCURSOR;

END AUTHENTICATION_PKG;

CREATE OR REPLACE PACKAGE BODY PAYGATEMANAGER.AUTHENTICATION_PKG AS 

FUNCTION getUser(username IN VARCHAR2) 
    RETURN T_REFCURSOR IS
        userInfo T_REFCURSOR;
BEGIN

    OPEN userInfo FOR
    SELECT
        U.NAME AS username ,
        P.PASSWORD AS password,
        'true' AS enabled            
    FROM
        PAYGATEMANAGER.USERS U INNER JOIN PAYGATEMANAGER.PASSWORDS P
        USING(USER_ID)
    WHERE 
        U.NAME = username;

RETURN userInfo;
END;

FUNCTION getAuthorities(username IN VARCHAR2) 
    RETURN T_REFCURSOR IS
        userAuthorities T_REFCURSOR;
BEGIN

    OPEN userAuthorities FOR
    SELECT
        U.NAME AS username ,
        UR.ROLE AS authorities           
    FROM
        PAYGATEMANAGER.USERS U INNER JOIN PAYGATEMANAGER.USERS_ROLES UR
        USING(USER_ID)
    WHERE 
        U.NAME = username;

RETURN userAuthorities;
END;

END AUTHENTICATION_PKG;

Я думаю, что причина в возвращаемом типе T_REFCURSOR, который не загружается в имя пользователя, пароль, включен. Но как это исправить? Чтобы добавить некоторые функции в будущем (например, аудит попыток входа в систему), я думаю, что я должен делать это в функциях PL / SQL, а не в жестком кодировании в SQL.

1 Ответ

0 голосов
/ 13 мая 2011

Это определенно не будет работать с "из коробки" JdbcDaoImpl (это то, на что <jdbc-user-service> отображается).Я бы предложил рассмотреть исходный код стандартной реализации, а затем написать собственную реализацию, которая реализует Spring Security UserDetailsService, но использует JDBC и CallableStatement под одеялом.

Вы объявите свой класс реализациикак обычный пружинный компонент:

 <bean id="MyPlsqlUserDetailsService" class="my.great.JdbcCallableStatementImpl"/>

... и затем используйте атрибут ref для <user-details-service> следующим образом:

 <user-details-service ref="MyPlsqlUserDetailsService"/>

(обратите внимание, что я опускаюзапутанность пространств имен XML и т. д., надеюсь, вы понимаете это).

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...