SpringSide 3 內建基於數據庫的 RBAC 模型:users、roles、authorities、resources 四表。預定義「管理員」「用戶」兩角色。擴展權限僅需向數據庫插入記錄,無需改代碼。
INSERT INTO AUTHORITIES (NAME, DISPLAY_NAME) VALUES ('A_ADD_ARTICLE', '添加文章');
INSERT INTO AUTHORITIES (NAME, DISPLAY_NAME) VALUES ('A_DELETE_ARTICLE', '刪除文章');
-- 管理員擁有增刪權限
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);
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);
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(索引庫)。
transactions-essentials-all.jar, jta.properties → WEB-INF/lib
ArticleIndex、ArticleIndexDao、ArticleIndexManager,邏輯與主表一致。Action 中同步調用雙 Manager 實現雙寫。
<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"/>
<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>
@Resource(name = "sessionFactoryContent")
public void setSessionFactory(SessionFactory sf) { super.setSessionFactory(sf); }
SpringSide 3 提供了開箱即用的 RBAC 權限模型與標準化的多分據源 JTA 整合範例。權限擴展純數據庫操作,多分據源通過 Atomikos + 雙 SessionFactory + 雙 Filter 實現,業務代碼無感知。源碼下載:MultiDatasourceExample.rar(需手動建庫、配置密碼、補全 jar)。