2015-03-27 2 views
0

Я пытаюсь подключиться к оракулу DB. Я хочу получить список паролей из базы данных с помощью запроса аутентификации. Вот мой пример shiro.ini файла:Ошибка входа в Apache Shiro с использованием JDBC Realm

# password matcher 
passwordMatcher = org.apache.shiro.authc.credential.PasswordMatcher 
passwordService = org.apache.shiro.authc.credential.DefaultPasswordService 
passwordMatcher.passwordService = $passwordService 

# datasource 
ds = oracle.jdbc.pool.OracleDataSource 
ds.URL = jdbc:oracle:thin:@matrix-oracle11g:1521:dev11g 
ds.user = cit1am 
ds.password = cit1 

jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm 
jdbcRealm.permissionsLookupEnabled = true 
jdbcRealm.authenticationQuery = SELECT USR_PSWD FROM USR 
jdbcRealm.credentialsMatcher = $passwordMatcher 
jdbcRealm.dataSource = $ds 
securityManager.realms = $jdbcRealm 
[users] 

[roles] 

[urls] 

Sample фрагмент кода авторизации:

public class Quickstart { 

    private static final transient Logger log = LoggerFactory.getLogger(Quickstart.class); 


    public static void main(String[] args) { 
    Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); 
     SecurityManager securityManager = factory.getInstance(); 
     SecurityUtils.setSecurityManager(securityManager); 
     Subject currentUser = SecurityUtils.getSubject(); 

     // Do some stuff with a Session (no need for a web or EJB container!!!) 
     Session session = currentUser.getSession(); 
     session.setAttribute("someKey", "aValue"); 
     String value = (String) session.getAttribute("someKey"); 
     if (value.equals("aValue")) { 
      log.info("Retrieved the correct value! [" + value + "]"); 
     } 
     try{ 
     // let's login the current user so we can check against roles and permissions: 
     if (!currentUser.isAuthenticated()) { 

      UsernamePasswordToken token = new UsernamePasswordToken("cit1am", "cit1") ; 
      token.setRememberMe(true); 
      try { 
       currentUser.login(token); //problem occurs here 
       log.info("inside try block ==========>>"); 
      } 
catch (UnknownAccountException uae) { 
       log.info("There is no user with username of " + token.getPrincipal()); 
      } 

Я получаю следующее сообщение об ошибке:

[main] ERROR org.apache.shiro.realm.jdbc.JdbcRealm - There was a SQL error while authenticating user [cit1am] 
java.sql.SQLException: Invalid column index 
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70) 
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:445) 

Пожалуйста, предложить то, что я делаю неправильно?

ответ

2

После отладки больше я обнаружил проблему с моим кодом и запросом sql в файле .ini. я изменен в файле .ini

jdbcRealm.authenticationQuery = SELECT USR_PSWD FROM USR where USR_NM = ? 
Also commented 
#cm = org.apache.shiro.authc.credential.Sha256CredentialsMatcher 
#jdbcRealm.credentialsMatcher = $cm and removedconfiguration related to password matcher 

Я также удалить роль и проверки прав доступа из кода Java.

Как я только что начал с shrio, немного сложно понять поток при запуске. Хотя это может помочь кому-то в будущем.

С благодарностью

Смежные вопросы