2014-11-21 3 views
7

Я создаю свой собственный подкласс AuthorizingRealm, и мне трудно провести его проводку до моего SecurityManager.Написание пользовательских Shiro realm

Суть моего царства:

public class MyRealm extends AuthorizingRealm { 
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { 
     try { 
      // My custom logic here 

     } catch(Throwable t) { 
      System.out.println(t.getMessage()); 
     } 
     SimpleAuthenticationInfo authn = new SimpleAuthenticationInfo(new MyUser(), "somePassword"); 
     return authn; 
    } 

    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { 
     try { 
      // My custom logic here 
     } catch(Throwable t) { 
      System.out.println(t.getMessage()); 
     } 
     return new SimpleAuthorizationInfo(); 
    } 
} 

Тогда в моем 'shiro.ini':

# ======================= 
# Shiro INI configuration 
# ======================= 
[main] 
myRealm = com.me.myapp.security.MyRealm 

Тогда в моем классе Driver/основной метод (который я использую для тестирования) :

public class Driver { 
    public static void main(String[] args) { 
     Driver d = new Driver(); 
     d.test(); 
    } 

    public void test() { 
     Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); 
     SecurityManager securityManager = factory.getInstance(); 
     SecurityUtils.setSecurityManager(securityManager); 

     UsernamePasswordToken token = new UsernamePasswordToken("", ""); 
     token.setRememberMe(true); 

     System.out.println("Shiro props:"); 
     System.out.println(securityManager.getProperties()); 

     Subject currentUser = SecurityUtils.getSubject() 

     try { 
      currentUser.login(token) 

      println "I think this worked!" 
     } catch (UnknownAccountException uae) { 
      println "Exception: ${uae}" 
     } catch (IncorrectCredentialsException ice) { 
      println "Exception: ${ice}" 
     } catch (LockedAccountException lae) { 
      println "Exception: ${lae}" 
     } catch (ExcessiveAttemptsException eae) { 
      println "Exception: ${eae}" 
     } catch (AuthenticationException ae) { 
      println "Exception: ${ae}" 
     } 
    } 
} 

Когда я запускаю это я получаю:

Shiro props: 
[class:class org.apache.shiro.mgt.DefaultSecurityManager, cacheManager:null, subjectFactory:[email protected], authorizer:[email protected], realms:[[email protected]], subjectDAO:[email protected], rememberMeManager:null, authenticator:[email protected], sessionManager:[email protected]] 
Exception: org.apache.shiro.authc.AuthenticationException: Authentication failed for token submission [org.apache.shiro.authc.UsernamePasswordToken - , rememberMe=true]. Possible unexpected error? (Typical or expected login exceptions should extend from AuthenticationException). 

Итак, похоже, что он читает мой shiro.ini, потому что он подбирает правильное царство, но MyRealm не делает ничего, кроме фиктивных пользователей-заглушек, которые должны пройти аутентификацию независимо от введенного имени пользователя и пароля. Какие-нибудь идеи относительно того, где я буду ошибаться?

ответ

3

Вы можете посмотреть на исходный код Stormpath Shiro плагин в GitHub может: Plugin here и образец приложения, используя плагин here.

Мы внедрили наш AuthorizingRealm (аналогично тому, что вам нужно). Вы можете быть заинтересованы в принятии смотреть на:

  1. https://github.com/stormpath/stormpath-shiro/blob/master/core/src/main/java/com/stormpath/shiro/realm/ApplicationRealm.java
  2. https://github.com/stormpath/stormpath-shiro-web-sample/blob/master/src/main/webapp/WEB-INF/shiro.ini

Кстати, в ваших shiro.ini вам нужно добавить следующее: securityManager.realm = $myRealm

0

добавить к вашей shiro.ini: securityManager.realms = $myRealm
затем в драйвере класса

UsernamePasswordToken token = new UsernamePasswordToken("", "somePassword"); 

вместо пустого passowrd.

Я думаю, что это сработало!

+0

Спасибо @Luca Rasconi, однако ваши предложения ничего не меняйте (такое же поведение, как описано выше). Любые другие мысли/идеи? Еще раз спасибо! – smeeb

0

я не сделал это сам, но вот несколько вещей, которые вы можете попробовать:

  1. Если вам не нужна логика авторизации, рассмотрим подклассов AuthenticatingRealm вместо AuthorizingRealm

  2. В метод doGetAuthenticationInfo, рассмотрите этот код:

    SimpleAuthenticationInfo authn = new SimpleAuthenticationInfo (token.getPrincipal(), token.getCredentials(), "myRealm");

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