首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

SpringSide 3.1.4 實戰(下):Spring Security 權限體系與 Atomikos 多分據源整合

     編輯:Java 相關知識

第八步:Spring Security 保護 Web 資源

SpringSide 3 內建基於數據庫的 RBAC 模型:users、roles、authorities、resources 四表。預定義「管理員」「用戶」兩角色。擴展權限僅需向數據庫插入記錄,無需改代碼。

1. 新增權限點

INSERT INTO AUTHORITIES (NAME, DISPLAY_NAME) VALUES ('A_ADD_ARTICLE', '添加文章');
INSERT INTO AUTHORITIES (NAME, DISPLAY_NAME) VALUES ('A_DELETE_ARTICLE', '刪除文章');

2. 角色-權限關聯

-- 管理員擁有增刪權限
INSERT INTO ROLES_AUTHORITIES VALUES (1, 5); -- A_ADD_ARTICLE
INSERT INTO ROLES_AUTHORITIES VALUES (1, 6); -- A_DELETE_ARTICLE
-- 用戶僅擁有增權限
INSERT INTO ROLES_AUTHORITIES VALUES (2, 5);

3. 定義受保護資源

INSERT INTO RESOURCES (RESOURCE_TYPE, VALUE, ORDER_NUM) VALUES ('url', '/article!input*', 7.0);
INSERT INTO RESOURCES (RESOURCE_TYPE, VALUE, ORDER_NUM) VALUES ('url', '/article!save*', 8.0);
INSERT INTO RESOURCES (RESOURCE_TYPE, VALUE, ORDER_NUM) VALUES ('url', '/article!delete*', 9.0);

4. 資源-權限綁定

INSERT INTO RESOURCES_AUTHORITIES VALUES (5, 7); -- 添加文章 → input/save
INSERT INTO RESOURCES_AUTHORITIES VALUES (5, 8);
INSERT INTO RESOURCES_AUTHORITIES VALUES (6, 9); -- 刪除文章 → delete

效果:未登入用戶僅可查看;點擊新增/刪除跳轉登入頁或提示無權限。視圖層可用 Spring Security 標簽進一步控制按鈕顯示。

第九步:遷移到多分據源環境

採用 Atomikos 3.5.5 實現 JTA 分布式事務,雙數據源分別對應 MultiDatasourceExample(內容庫)與 MultiDatasourceExampleIndex(索引庫)。

1. Maven 依賴

transactions-essentials-all.jar, jta.properties → WEB-INF/lib

2. 實體/DAO/Manager 雙份構建

ArticleIndex、ArticleIndexDao、ArticleIndexManager,邏輯與主表一致。Action 中同步調用雙 Manager 實現雙寫。

3. Spring 配置核心點

<bean id="dataSourceContent" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
  <property name="uniqueResourceName" value="jdbc/dataSourceContent"/>
  <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>
  <property name="xaProperties"><props>...</props></property>
  <property name="poolSize" value="3"/>
</bean>

<bean id="sessionFactoryContent" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dataSource" ref="dataSourceContent"/> ...
</bean>


<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
  <property name="forceShutdown" value="true"/>
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
  <property name="transactionTimeout" value="300"/>
</bean>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
  <property name="transactionManager" ref="atomikosTransactionManager"/>
  <property name="userTransaction" ref="atomikosUserTransaction"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>

4. web.xml 雙 OpenSessionInViewFilter

<filter>
  <filter-name>hibernateOpenSessionInViewFilterContent</filter-name>
  <filter-class>org.springside.modules.orm.hibernate.OpenSessionInViewFilter</filter-class>
  <init-param><param-name>sessionFactoryBeanName</param-name><param-value>sessionFactoryContent</param-value></init-param>
</filter>
<filter>
  <filter-name>hibernateOpenSessionInViewFilterIndex</filter-name>
  <filter-class>org.springside.modules.orm.hibernate.OpenSessionInViewFilter</filter-class>
  <init-param><param-name>sessionFactoryBeanName</param-name><param-value>sessionFactoryIndex</param-value></init-param>
</filter>

5. DAO 指定 SessionFactory

@Resource(name = "sessionFactoryContent")
public void setSessionFactory(SessionFactory sf) { super.setSessionFactory(sf); }

總結

SpringSide 3 提供了開箱即用的 RBAC 權限模型與標準化的多分據源 JTA 整合範例。權限擴展純數據庫操作,多分據源通過 Atomikos + 雙 SessionFactory + 雙 Filter 實現,業務代碼無感知。源碼下載:MultiDatasourceExample.rar(需手動建庫、配置密碼、補全 jar)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved