You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shiro.apache.org by lh...@apache.org on 2010/01/15 20:21:35 UTC

svn commit: r899768 - in /incubator/shiro/trunk/core/src: main/java/org/apache/shiro/config/IniSecurityManagerFactory.java test/java/org/apache/shiro/config/IniSecurityManagerFactoryTest.java

Author: lhazlewood
Date: Fri Jan 15 19:21:34 2010
New Revision: 899768

URL: http://svn.apache.org/viewvc?rev=899768&view=rev
Log:
SHIRO-125 - implemented fix by enabling the implicitly created IniRealm to be configurable in the [main] section.  Added accompanying 'testImplicitIniRealmWithAdditionalRealmConfiguration' test.

Modified:
    incubator/shiro/trunk/core/src/main/java/org/apache/shiro/config/IniSecurityManagerFactory.java
    incubator/shiro/trunk/core/src/test/java/org/apache/shiro/config/IniSecurityManagerFactoryTest.java

Modified: incubator/shiro/trunk/core/src/main/java/org/apache/shiro/config/IniSecurityManagerFactory.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/core/src/main/java/org/apache/shiro/config/IniSecurityManagerFactory.java?rev=899768&r1=899767&r2=899768&view=diff
==============================================================================
--- incubator/shiro/trunk/core/src/main/java/org/apache/shiro/config/IniSecurityManagerFactory.java (original)
+++ incubator/shiro/trunk/core/src/main/java/org/apache/shiro/config/IniSecurityManagerFactory.java Fri Jan 15 19:21:34 2010
@@ -44,6 +44,7 @@
     public static final String MAIN_SECTION_NAME = "main";
 
     public static final String SECURITY_MANAGER_NAME = "securityManager";
+    public static final String INI_REALM_NAME = "iniRealm";
 
     private static transient final Logger log = LoggerFactory.getLogger(IniSecurityManagerFactory.class);
 
@@ -88,10 +89,13 @@
         return doCreateSecurityManager(ini, mainSection);
     }
 
-    private Map<String, Object> buildMainInstances(Ini.Section main) {
+    private Map<String, Object> buildMainInstances(Ini.Section main, Realm iniRealm) {
         Map<String, Object> defaults = new LinkedHashMap<String, Object>();
         SecurityManager securityManager = createDefaultInstance();
-        defaults.put("securityManager", securityManager);
+        defaults.put(SECURITY_MANAGER_NAME, securityManager);
+        if (iniRealm != null) {
+            defaults.put(INI_REALM_NAME, iniRealm);
+        }
         return buildInstances(main, defaults);
     }
 
@@ -182,13 +186,21 @@
      * @return a new Realm instance reflecting the account data discovered in the {@code Ini}.
      */
     protected Realm createRealm(Ini ini) {
-        return new IniRealm(ini);
+        IniRealm realm = new IniRealm(ini);
+        realm.setName(INI_REALM_NAME);
+        return realm;
     }
 
     @SuppressWarnings({"unchecked"})
     protected SecurityManager doCreateSecurityManager(Ini ini, Ini.Section mainSection) {
 
-        Map<String, Object> objects = buildMainInstances(mainSection);
+        Realm iniRealm = null;
+
+        if ( shouldImplicitlyCreateRealm(ini) ) {
+            iniRealm = createRealm(ini);
+        }
+
+        Map<String, Object> objects = buildMainInstances(mainSection, iniRealm);
 
         SecurityManager securityManager = (SecurityManager) objects.get(SECURITY_MANAGER_NAME);
 
@@ -196,11 +208,6 @@
         //initialize the securityManager:
         Collection<Realm> realms = getRealms(objects);
 
-        if (shouldImplicitlyCreateRealm(ini)) {
-            Realm realm = createRealm(ini);
-            realms.add(realm);
-        }
-
         //set them on the SecurityManager
         if (!CollectionUtils.isEmpty(realms)) {
             applyRealmsToSecurityManager(realms, securityManager);

Modified: incubator/shiro/trunk/core/src/test/java/org/apache/shiro/config/IniSecurityManagerFactoryTest.java
URL: http://svn.apache.org/viewvc/incubator/shiro/trunk/core/src/test/java/org/apache/shiro/config/IniSecurityManagerFactoryTest.java?rev=899768&r1=899767&r2=899768&view=diff
==============================================================================
--- incubator/shiro/trunk/core/src/test/java/org/apache/shiro/config/IniSecurityManagerFactoryTest.java (original)
+++ incubator/shiro/trunk/core/src/test/java/org/apache/shiro/config/IniSecurityManagerFactoryTest.java Fri Jan 15 19:21:34 2010
@@ -18,16 +18,21 @@
  */
 package org.apache.shiro.config;
 
-import static junit.framework.Assert.*;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.crypto.hash.Sha256Hash;
 import org.apache.shiro.mgt.DefaultSecurityManager;
 import org.apache.shiro.mgt.SecurityManager;
 import org.apache.shiro.realm.Realm;
 import org.apache.shiro.realm.text.IniRealm;
 import org.apache.shiro.realm.text.PropertiesRealm;
+import org.apache.shiro.subject.Subject;
 import org.junit.Test;
 
 import java.util.Collection;
 
+import static junit.framework.Assert.*;
+
 /**
  * Unit tests for the {@link IniSecurityManagerFactory} implementation.
  *
@@ -108,5 +113,42 @@
         assertTrue(((IniRealm) realm).accountExists("admin"));
     }
 
+    /**
+     * Test for issue <a href="https://issues.apache.org/jira/browse/SHIRO-125">SHIRO-125</a>.
+     */
+    @Test
+    public void testImplicitIniRealmWithAdditionalRealmConfiguration() {
+
+        Ini ini = new Ini();
+
+        //The users section below should create an implicit 'iniRealm' instance in the
+        //main configuration.  So we should be able to set properties on it immediately
+        //such as the Sha256 credentials matcher:
+        Ini.Section main = ini.addSection("main");
+        main.put("credentialsMatcher", "org.apache.shiro.authc.credential.Sha256CredentialsMatcher");
+        main.put("iniRealm.credentialsMatcher", "$credentialsMatcher");
+
+        //create a users section - user 'admin', with a Sha256-hashed 'admin' password (hex encoded):
+        Ini.Section users = ini.addSection(IniRealm.USERS_SECTION_NAME);
+        users.put("admin", new Sha256Hash("secret").toString());
+
+        IniSecurityManagerFactory factory = new IniSecurityManagerFactory(ini);
+        SecurityManager sm = factory.getInstance();
+
+        //go ahead and try to log in with the admin user, ensuring the 
+        //iniRealm has a Sha256CredentialsMatcher enabled:
 
+        //try to log-in:
+        Subject subject = new Subject.Builder(sm).buildSubject();
+        //ensure thread clean-up after the login method returns.  Test cases only:
+        subject.execute(new Runnable() {
+            public void run() {
+                //the plain-text 'secret' should be converted to an Sha256 hash first
+                //by the CredentialsMatcher.  This should return quietly if
+                //this test case is valid:
+                SecurityUtils.getSubject().login(new UsernamePasswordToken("admin", "secret"));
+            }
+        });
+        assertTrue(subject.getPrincipal().equals("admin"));
+    }
 }