2016-03-03 221 views
0
CREATE TABLE `role_details` (
    `role_id` int(11) NOT NULL AUTO_INCREMENT, 
    `role_name` varchar(45) DEFAULT NULL, 
    `role_desc` varchar(100) DEFAULT NULL, 
    `rights` varchar(300) DEFAULT NULL, 
    PRIMARY KEY (`role_id`) 
) 



CREATE TABLE `user_details` (
    `user_id` int(11) NOT NULL AUTO_INCREMENT, 
    `display_name` varchar(45) DEFAULT NULL, 
    `password` varchar(45) DEFAULT NULL, 
    `emp_id` int(11) DEFAULT NULL, 
    `role` varchar(45) DEFAULT NULL, 
    `email` varchar(45) DEFAULT NULL, 
    `mobile` varchar(45) DEFAULT NULL, 
    `creation_time` datetime DEFAULT CURRENT_TIMESTAMP, 
    `status` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`user_id`) 
) 

這是我的數據庫模式。我正在使用彈簧安全。 但我很困惑......我需要寫在spring-security.xml基於角色的彈簧安全儀表板

<authentication-manager> 
     <authentication-provider> 
     <jdbc-user-service data-source-ref="dataSource" 
      users-by-username-query= 
      "SELECT * FROM hmis_db.user_details where display_name=? and status='active'" 
      authorities-by-username-query= 
      "**QUESTION** " /> 
     </authentication-provider> 
    </authentication-manager> 

其實我想創建基於角色的儀表板。和role_details表中的'權限',它指定了訪問菜單列表。根據它將生成基於角色的儀表板。

回答

0

請參考以下鏈接一旦你熟悉基本覆蓋的基礎知識和例子http://en.tekstenuitleg.net/blog/spring-security-with-roles-and-rights

,請更深入的Spring Security文檔https://docs.spring.io/spring-security/site/docs/3.0.x/reference/ns-config.html您實現生產代碼之前。

如果你正在使用Spring Security的4,你可能更喜歡基於註解配置像

@Configuration 
@EnableWebSecurity 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Autowired 
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception { 
     auth.inMemoryAuthentication().withUser("user").password("userpwd").roles("USER"); 
     auth.inMemoryAuthentication().withUser("admin").password("adminpwd").roles("ADMIN"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 

     http.authorizeRequests() 
     .antMatchers("/", "/home").permitAll() 
     .antMatchers("/admin/**").access("hasRole('ADMIN')") 
     .and().formLogin() 
     .and().exceptionHandling().accessDeniedPage("/Access_Denied"); 

    } 
} 
1

其實我看不到你的UserDetails表和RoleDetails一個之間的關係,也許我失去了一些東西。

當我做出這樣的實體模式時,我總是在用戶和角色之間建立一個1對n的關係,因此一個用戶可以擁有一個或多個角色。

但是假設你正在建立從用戶到角色的1-1關係,並且假設你正在尋找的ROLE_xxx位於UserDetails表中的角色字段中,那麼你的用戶名 - 查詢器查詢必須或多或少像這樣的:

"select display_name as username, role as authority from user_details where display_name =? " 

如果user_details場上的作用是外鍵必須在role_details領域ROLE_NAME匹配,並且 - 瑞實際上這是在security_intercept URL的訪問元素引用的機關,它應該是這樣的:

"select u.display_name as username, r.rights as authority 
from user_details as u INNER JOIN role_details as r ON u.role = r.role_name 
where u.display_name =? " 

但是,如果權限是逗號分隔的權限列表,您可能會遇到麻煩。用戶名 - 查詢權限期望在每行中接收具有權限的行的列表。如果這是你在尋找什麼,你應該考慮改變的模式或使返回每行結果的右側的表,甚至一個視圖

編輯:我應該做的是這樣的:

enter image description here

這是創建腳本:

CREATE TABLE IF NOT EXISTS `role_details` (
    `role_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `role_name` VARCHAR(45) NULL DEFAULT NULL, 
    `role_desc` VARCHAR(100) NULL DEFAULT NULL, 
    `role_authority` VARCHAR(300) NOT NULL, 
    PRIMARY KEY (`role_id`)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 


CREATE TABLE IF NOT EXISTS `user_details` (
    `user_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `display_name` VARCHAR(45) NULL DEFAULT NULL, 
    `password` VARCHAR(45) NULL DEFAULT NULL, 
    `emp_id` INT(11) NULL DEFAULT NULL, 
    `email` VARCHAR(45) NULL DEFAULT NULL, 
    `mobile` VARCHAR(45) NULL DEFAULT NULL, 
    `creation_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP, 
    `status` TINYINT(1) NULL DEFAULT 0, 
    PRIMARY KEY (`user_id`)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 


CREATE TABLE IF NOT EXISTS `user_role_details` (
    `user_details_user_id` INT(11) NOT NULL, 
    `role_details_role_id` INT(11) NOT NULL, 
    PRIMARY KEY (`user_details_user_id`, `role_details_role_id`), 
    INDEX `fk_user_details_has_role_details_role_details1_idx` (`role_details_role_id` ASC), 
    INDEX `fk_user_details_has_role_details_user_details_idx` (`user_details_user_id` ASC), 
    CONSTRAINT `fk_user_details_has_role_details_user_details` 
    FOREIGN KEY (`user_details_user_id`) 
    REFERENCES `user_details` (`user_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_user_details_has_role_details_role_details1` 
    FOREIGN KEY (`role_details_role_id`) 
    REFERENCES `role_details` (`role_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 

注意我刪除了user_details列「角色」,更名爲「權利」,以從varchar在role_details「role_authority」,改變了「狀態」改爲TINYINT(1)使用它作爲布爾。

然後,用戶詳細信息sql語句:

 users-by-username-query= 
    "SELECT display_name as username, password, status as enabled 
FROM user_details as u WHERE u.display_name = ? and status = 1;" 

     authorities-by-username-query= 
    "Select u.display_name as username, r.role_authority as authority 
     FROM 
     user_details as u 
     INNER JOIN user_role_details as urd ON u.user_id = urd.user_details_user_id 
     INNER JOIN role_details as r ON urd.role_details_role_id = r.role_id 
     WHERE u.display_name = ?" 

這樣你就可以擁有多個角色綁定到每個用戶

+0

可以請你給我提供正確的架構和相關查詢? –