2013-04-26 37 views
6

Tôi muốn sử dụng Shiro trên dự án web tiếp theo của mình nhưng tôi không biết một chiến lược tốt (nếu không phải là tốt nhất) để quản lý người dùng ([người dùng] trong shiro.ini).Apache Shiro: Bạn quản lý người dùng như thế nào?

  1. Tốt nhất bạn nên tạo người dùng Shiro cho mọi thành viên đã đăng ký?
  2. Hoặc tạo một người dùng Shiro duy nhất sau đó cho mỗi thành viên chỉ lưu trữ nó vào một số cơ sở dữ liệu và truy cập nó thông qua người dùng Shiro đó?

Nếu bạn chọn số 1, bạn sẽ quản lý/tự động hóa nó như thế nào? Hầu hết các dự án tôi đã chọn để chọn # 2.

Cảm ơn

Trả lời

10
  1. Cấu hình người dùng trong shiro.ini không phải là một lựa chọn tốt cho môi trường sản xuất. Nó chỉ có thể được sử dụng nếu bạn có một số lượng nhỏ tài khoản người dùng và bạn không cần phải tạo hoặc thay đổi tài khoản khi chạy. Nó chủ yếu được sử dụng để thử nghiệm.
  2. Tốt hơn cho hầu hết các dự án sử dụng một số dung lượng lưu trữ để giữ tất cả tài khoản người dùng. Nó có thể là cơ sở dữ liệu hoặc một số công cụ xác thực bên ngoài, như ldap, cas hoặc thậm chí là oauth.
3

Bạn chỉ có thể sử dụng Stormpath làm cửa hàng người dùng/nhóm của mình. Thả trong kho dữ liệu Shiro integration và bùng nổ - tức thì người dùng/nhóm cho các ứng dụng hỗ trợ Shiro với giao diện người dùng quản lý đầy đủ và Java SDK.

Nó thậm chí còn giúp tự động hóa những thứ như email 'quên mật khẩu' và xác minh email tài khoản. Nó miễn phí cho nhiều tập quán. Bạn có thể xem ví dụ Shiro sample app using Stormpath.

0

Shiro cung cấp nhiều cách để định cấu hình người dùng. Hãy xem các cấu hình Realm có thể here.

Nếu không thỏa mãn nhu cầu của bạn, bạn thậm chí có thể viết một lĩnh vực tùy chỉnh cho ứng dụng của bạn, có thể lấy thông tin người dùng từ cơ sở dữ liệu NoSQL hoặc lấy thông tin từ phản hồi SAML hoặc sử dụng OAuth2. Đó là chắc chắn không nên tạo bất kỳ chi tiết người dùng trong shiro.ini trong sản xuất. Để đưa ra khái niệm về những cảnh giới tùy chỉnh có thể trông như thế nào, đây là ví dụ nơi tôi đã tạo authc và authz người dùng dựa trên SAML2: shiro-saml2.

0

Vui lòng không chỉ sử dụng một người dùng cho tất cả mọi người. Tránh tùy chọn này. Tốt hơn nhiều khi sử dụng một người dùng (tài khoản) cho mỗi người dùng.

Trong shiro, bạn có thể có RDMS Realm cho phép bạn sử dụng cơ sở dữ liệu đơn giản như mysql để lưu trữ người dùng/tài khoản/quyền của bạn. :)

Sao chép dự án này, (không phải của tôi) và bắt đầu sau 1 phút! :) shiro/mysql GIT example Hãy tận hưởng nó :)

0

Shiro cung cấp việc triển khai lĩnh vực của riêng bạn theo yêu cầu của bạn.

Tạo một vùng đơn giản mà bạn có thể quản lý chi tiết, đăng nhập, quyền và vai trò. Bạn có thể sử dụng jdbc, Hibernate hoặc bất kỳ cách xác thực nào khác để quản lý chúng.

Định cấu hình lĩnh vực này thành ini của bạn hoặc bất kỳ cách nào bạn sử dụng trong dự án của mình.

Bây giờ Shiro sẽ tự động gọi các phương thức của lớp lãnh vực của bạn để tìm kiếm thông tin xác thực, quyền, vai trò.

Ví dụ: Tôi có một lĩnh vực hibernate shiro Tôi đã sử dụng mã ngủ đông để quản lý người dùng trong db của mình.

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; 
    } 

} 
Các vấn đề liên quan