2013-04-26 3 views
6

다음 웹 프로젝트에서 Shiro를 사용하고 싶지만 shiro.ini에서 사용자 ([사용자])를 관리하는 좋은 전략은 아닙니다.Apache Shiro : 사용자를 어떻게 관리 하시겠습니까?

  1. 등록 된 모든 회원에게 Shiro 사용자를 만드는 것이 가장 좋습니까?
  2. 하나의 Shiro 사용자를 생성 한 다음 모든 회원에게 일부 데이터베이스에 저장하고 Shiro 사용자를 통해 액세스하십시오.

1 위를 차지한다면 어떻게 관리 하시겠습니까/자동화합니까? 제가 작업 한 대부분의 프로젝트는 # 2를 선택했습니다. shiro.ini에서 사용자를 구성

덕분에

답변

10
  1. 프로덕션 환경에 대한 좋은 선택지가 아니다. 적은 수의 사용자 계정이 있고 런타임에 계정을 만들거나 변경할 필요가없는 경우에만 사용할 수 있습니다. 그것은 주로 테스트에 사용됩니다.
  2. 거의 모든 프로젝트에서 모든 사용자 계정을 유지하기 위해 일부 저장소를 사용하는 것이 좋습니다. 그것은 데이터베이스 나 ldap, cas 또는 심지어 oauth와 같은 일부 외부 인증 엔진이 될 수 있습니다.
3

사용자/그룹 저장소로 Stormpath을 사용할 수 있습니다. 전체 관리 UI 및 Java SDK를 사용하여 Shiro 지원 응용 프로그램의 Shiro integration 및 boom - instant 사용자/그룹 데이터 저장소를 삭제하십시오.

'비밀번호 찾기'이메일 및 계정 이메일 확인과 같은 작업을 자동화하는 데 도움이됩니다. 그것은 많은 용도에도 무료입니다. 예를 들어 Shiro sample app using Stormpath을 볼 수 있습니다.

0

Shiro는 사용자를 구성하는 여러 가지 방법을 제공합니다. 가능한 영역 구성 here을 살펴보십시오.

사용자의 요구를 충족시키지 못하면 NoSQL 데이터베이스에서 사용자 정보를 가져 오거나 SAML 응답에서 정보를 가져 오거나 OAuth2를 사용하여 응용 프로그램에 대한 사용자 지정 영역을 작성할 수 있습니다. 생산중인 shiro.ini에 사용자 정보를 생성하는 것은 바람직하지 않습니다. 사용자 정의 영역이 어떤 모양인지 알기 위해 여기 SAML2 기반 사용자 authc 및 authz를 작성한 예가 있습니다 (shiro-saml2).

0

모두에게 한 명의 사용자 만 사용하지 마십시오. 이 옵션을 사용하지 마십시오. 사용자 당 한 명의 사용자 (계정)를 사용하는 것이 훨씬 좋습니다.

shiro에서 사용자/계정/권한을 저장하기 위해 mysql과 같은 간단한 데이터베이스를 사용할 수있는 RDMS 영역을 가질 수 있습니다. :)

이 프로젝트를 복제하십시오. (내 것이 아닙니다.) 1 분 안에 시작하십시오! :) shiro/mysql GIT example 즐기십시오 :)

0

시로 귀하의 요구 사항에 따라 자신의 영역을 구현하십시오.

세부 정보, 로그인, 권한 및 역할을 관리 할 수있는 단순 영역을 만듭니다. jdbc, Hibernate 또는 기타 인증 방법을 사용하여 관리 할 수 ​​있습니다.

이 영역을 ini 또는 프로젝트에서 사용하는 방식으로 구성하십시오.

이제 Shiro는 영역 클래스의 메소드를 자동으로 호출하여 자격 증명, 권한, 역할을 찾습니다.

예를 들어 나는 shiber hibernate realm을 가지고 있는데, 내 최대 절전 모드 코드를 사용하여 내 db에서 사용자를 관리했습니다.

import java.util.Collection; 
import java.util.Date; 
import java.util.HashSet; 

import org.apache.shiro.authc.AuthenticationException; 
import org.apache.shiro.authc.AuthenticationInfo; 
import org.apache.shiro.authc.AuthenticationToken; 
import org.apache.shiro.authc.SimpleAuthenticationInfo; 
import org.apache.shiro.authc.UsernamePasswordToken; 
import org.apache.shiro.authc.credential.CredentialsMatcher; 
import org.apache.shiro.authz.AuthorizationInfo; 
import org.apache.shiro.authz.SimpleAuthorizationInfo; 
import org.apache.shiro.realm.AuthorizingRealm; 
import org.apache.shiro.subject.PrincipalCollection; 

/** 
* @author Ankit 
* 
*/ 
public class PortalHibernateRealm extends AuthorizingRealm { 

    private static final Logger LOGGER = new Logger(
      PortalHibernateRealm.class.toString()); 

    /** 
    * 
    */ 
    public PortalHibernateRealm() { 
     super(); 
     /* 
     * Set credential matcher on object creation 
     */ 
     setCredentialsMatcher(new CredentialsMatcher() { 

      @Override 
      public boolean doCredentialsMatch(AuthenticationToken arg0, 
        AuthenticationInfo arg1) { 
       UsernamePasswordToken token = (UsernamePasswordToken) arg0; 
       String username = token.getUsername(); 
       String password = new String(token.getPassword()); 
       /* 
        Check for credential and return true if found valid else false 
       */ 
       return false; 
      } 
     }); 
    } 

    @Override 
    protected AuthorizationInfo doGetAuthorizationInfo(
      PrincipalCollection principalCollection) { 
     Collection<String> permissionSet; 
     SimpleAuthorizationInfo info = null; 
     Long userId = (Long) principalCollection.getPrimaryPrincipal(); 

     //Using thi principle create SimpleAuthorizationInfo and provide permissions and roles 
      info = new SimpleAuthorizationInfo(); 

     return info; 
    } 

    @Override 
    protected AuthenticationInfo doGetAuthenticationInfo(
      AuthenticationToken authcToken) throws AuthenticationException { 
     UsernamePasswordToken token = (UsernamePasswordToken) authcToken; 

     /*using this token create a SimpleAuthenticationInfo like 
     User user = UserUtil.findByEmail(token.getUsername()); 
     */ 
     SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
       primaryPrin, Password, screenName); 

     return authenticationInfo; 
    } 

} 
관련 문제