2013-02-14 51 views
3

我正在使用JDBC Realm并将身份验证数据存储在SQL中。我将salt存储在users表中并依靠DEFAULT_SALTED_AUTHENICATION_QUERY。要调用该查询,我必须设置SaltStyle。将值传递给Shiro ini中的枚举属性

因此,我需要通过INI将SaltStyle.COLUMN枚举值传递给JdbcRealm。

SaltStyle不是类,所以我不能创建一个引用

无论我做什么过程生成该错误= org.apache.shiro.config.UnresolveableReferenceException:

从exstensive搜索

找不到实例或参考文件。任何帮助深表感谢。

#==================================================================== 
# Shiro INI configuration 
# 
# =================================================================== 
[main] 
JdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm 
JdbcRealm.permissionsLookupEnabled = true 
sha256Matcher = org.apache.shiro.authc.credential.HashedCredentialsMatcher 
sha256Matcher.hashAlgorithmName=SHA-256 
sha256Matcher.hashIterations=1 
JdbcRealm.credentialsMatcher = $sha256Matcher 
JdbcRealm.saltStyle= enum expression needed here 

这里是JdbcRealm

public void setSaltStyle(SaltStyle saltStyle) { 
    this.saltStyle = saltStyle; 
    if (saltStyle == SaltStyle.COLUMN && authenticationQuery.equals 
      (DEFAULT_AUTHENTICATION_QUERY)) { 
     authenticationQuery = DEFAULT_SALTED_AUTHENTICATION_QUERY; 
    } 
} 

回答

2

物业我的理解是,目前(四郎1.2),你不能在shiro.ini配置枚举值,见this
但是,您可以在您调用realm相关方法(如登录)的java代码中执行此操作。我做到了我的servlet的init()如下:

public class AuthManager extends HttpServlet { 
protected SaltStyle saltStyle = SaltStyle.COLUMN; 
// set remaining fields... 
    public void init() throws ServletException { 
      Collection<Realm> realms=((RealmSecurityManager) securityManager).getRealms();  
      CustomJdbcRealm jdbcRealm=(CustomJdbcRealm)realms.toArray()[0]; 
      jdbcRealm.setSaltStyle(saltStyle); 
    } 
-1

您可以延长JdbcRealm和覆盖的方法:

- CustomShiroJdbcRealm.java:

public class CustomShiroJdbcRealm extends JdbcRealm { 

    public void setSaltStyle(String saltStyle) { 
     super.setSaltStyle(SaltStyle.valueOf(saltStyle)); 
    } 

} 

- - shiro.ini:

jdbcRealm = com.mycompany.CustomShiroJdbcRealm 
jdbcRealm.saltStyle = COLUMN