EJB3 Security on JBoss

1. 修改 JBoss Server 下的 ~/server/default/conf/login-config.xml
   您有兩種設定方式 : 使用 檔案認證 或是使用 資料庫認證
   1-1. 使用檔案系統認證 :
         (參考 http://docs.jboss.org/jbossas/admindevel326/html/ch8.chapter.html 其中的 8.4.6.2. org.jboss.security.auth.spi.UsersRolesLoginModule 一節說明)
    <application-policy name = "EJB3">
       <authentication>
          <login-module code = "org.jboss.security.auth.spi.UsersRolesLoginModule" flag = "required">
             <module-option name = "usersProperties">props/users.properties</module-option>
             <module-option name = "rolesProperties">props/roles.properties</module-option>
          </login-module>
       </authentication>
    </application-policy>
   
    如果您採用 檔案方式認證, 請記得加入 users.properties (格式 : 帳號=密碼) , roles.properties (格式: 帳號=權限)
    [ users.properties ]
    admin=admin
   
    [ roles.properties ]
    admin=admin
  
    1-2. 資料庫認證 :
         (參考 http://docs.jboss.org/jbossas/admindevel326/html/ch8.chapter.html 其中的 8.4.6.4. org.jboss.security.auth.spi.DatabaseServerLoginModule 一節說明)
    <application-policy name = "EJB3">
       <authentication>
          <login-module code = "org.jboss.security.auth.spi.DatabaseServerLoginModule" flag = "required">
              <module-option name = "dsJndiName">java:/MySqlDS</module-option>
              <module-option name = "principalsQuery">SELECT pass FROM user WHERE userName=?</module-option>
              <module-option name = "rolesQuery">SELECT role FROM roles WHERE userName=?</module-option>
          </login-module>
       </authentication>
    </application-policy>
   
2. EJB的專案
   請加入 jboss.xml 在 META-INF 目錄中
   [jboss.xml]
   <?xml version="1.0" encoding="UTF-8"?>
   <jboss>
       <security-domain>EJB3</security-domain>
       <unauthenticated-principal>anonymous</unauthenticated-principal>
   </jboss>
3. 在Session Bean 裡面加入權限控制
@Stateless
@RolesAllowed({"admin"})
public class TestService implements TestServiceLocal, TestServiceRemote, ServiceManagement {
 @RolesAllowed({"admin"})
 public String getHello(){
      return "Hello World";
 }
}
4. Client端測試
public class ClientMain {
    public static InitialContext getInitialContext() throws javax.naming.NamingException {
        Properties p = new Properties();
        p.setProperty(javax.naming.Context.SECURITY_PRINCIPAL, "admin");
        p.setProperty(javax.naming.Context.SECURITY_CREDENTIALS, "admin");
        p.setProperty(javax.naming.Context.PROVIDER_URL, "jnp://localhost:1099");
        p.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "org.jboss.security.jndi.JndiLoginInitialContextFactory");
        return new javax.naming.InitialContext(p);
    }
 
    public static void main(String[] args) throws Exception {
      InitialContext ctx = getInitialContext();
      TestService service = (TestService) ctx.lookup("HISService/remote");
       System.out.println(service.getHello());
    }
}
 
廣告

About fenjj

Perfect !!??...
本篇發表於 Uncategorized。將永久鏈結加入書籤。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s