2012-05-07 33 views
6

Đây là bài đăng đầu tiên của tôi ở đây. Tôi sẽ có hai câu hỏi liên quan đến bảo mật Java EE khai báo: (1) xác thực dựa trên tệp và (2) xác thực dựa trên DB. Tôi kèm theo các phần liên quan của cấu hình cho cả hai câu hỏi. Tôi chạy mã trên Glassfish 3.1.1. Cảm ơn bạn vì sự thừa nhận của bạn cũng trước.Bảo mật khai báo Java EE, Không thể tải nhóm cho người dùng lĩnh vực JDBC

Tôi cũng đang tìm câu trả lời cho câu hỏi của mình và tìm thấy một số ví dụ hữu ích mà tôi cũng đặt ở cuối thư. Tôi đã cố gắng theo dõi chúng để trạng thái hiện tại của cấu hình có thể chứa các chi tiết từ những mẫu này nhưng chúng không giải quyết được vấn đề.

Xác thực dựa trên vị trí hoạt động hoàn toàn nếu "mặc định chính cho vai trò ánh xạ" được chọn nếu không nó không hoạt động ngay cả khi hiệu trưởng được thêm vào ánh xạ. Tôi có thể đã cấu hình một cái gì đó không đúng cách.

xác thực dựa trên DB. Nó không hoạt động theo như ủy quyền có liên quan bởi vì các tên nhóm không thể đọc được. Xem chi tiết bên dưới. Xác thực hoạt động đúng nghĩa là người dùng được nhận dạng. Tôi thậm chí còn thử với đổi tên các bảng để tránh tiềm năng tên va chạm với một số nội dung bên trong của Glassfish ...

(1) Tập xác thực dựa trên: file lĩnh vực, 2 useres: hướng dẫn, quản trị gia tăng và gán cho nhóm: người dùng và quản trị (cấu hình/máy chủ-config/security/cõi/file -> Quản lý người dùng)

cấu hình/server-config/an ninh Mặc định Principal Để Vai trò Mapping "đánh dấu" -> nó hoạt động Mặc định Principal Để ánh xạ vai trò "không được đánh dấu" -> nó không hoạt động ngay cả khi được thêm vào bản đồ bảo mật.

web.xml 

[...] 
    <security-constraint> 
     <display-name>Admin Pages</display-name> 
     <web-resource-collection> 
      <web-resource-name>Protected Admin Area</web-resource-name> 
      <description/> 
      <url-pattern>/faces/admin/*</url-pattern> 
      <http-method>GET</http-method> 
      <http-method>POST</http-method> 
      <http-method>HEAD</http-method> 
      <http-method>PUT</http-method> 
      <http-method>OPTIONS</http-method> 
      <http-method>TRACE</http-method> 
      <http-method>DELETE</http-method> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>admin</role-name> 
     </auth-constraint> 
    </security-constraint> 
    <security-constraint> 
     <display-name>User Pages</display-name> 
     <web-resource-collection> 
      <web-resource-name>Protected Users Area</web-resource-name> 
      <description/> 
      <url-pattern>/faces/users/*</url-pattern> 
      <http-method>GET</http-method> 
      <http-method>POST</http-method> 
      <http-method>HEAD</http-method> 
      <http-method>PUT</http-method> 
      <http-method>OPTIONS</http-method> 
      <http-method>TRACE</http-method> 
      <http-method>DELETE</http-method> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>user</role-name> 
     </auth-constraint> 
    </security-constraint> 
    <login-config> 
     <auth-method>FORM</auth-method> 
     <realm-name>file</realm-name> 
     <form-login-config> 
      <form-login-page>/faces/loginForm.xhtml</form-login-page> 
      <form-error-page>/faces/loginError.xhtml</form-error-page> 
     </form-login-config> 
    </login-config> 

[...] 

glassfish-web.xml: 

<glassfish-web-app> 
    <security-role-mapping> 
     <role-name>admin</role-name> 
     <group-name>admin</group-name> 
    </security-role-mapping> 
    <security-role-mapping> 
     <role-name>user</role-name> 
     <group-name>user</group-name> 
    </security-role-mapping> 
</glassfish-web-app> 

lỗi Logged mà không có bản đồ chính mặc định:

  1. Không Hiệu ánh xạ tới Vai trò [user].
  2. Không có hiệu trưởng nào được ánh xạ tới Vai trò [quản trị viên].

Log without the default principal mapping: 
    <security-role-mapping> 
     <role-name>admin</role-name> 
     <group-name>admin</group-name> 
     <principal-name>admin</principal-name> 
    </security-role-mapping> 
    <security-role-mapping> 
     <role-name>user</role-name> 
     <group-name>user</group-name> 
     <principal-name>user</principal-name> 
    </security-role-mapping> 

lỗi Logged mà không có bản đồ chính mặc định: 1. Không Hiệu ánh xạ tới Vai trò [user]. 2. Không có Hiệu trưởng được ánh xạ tới Vai trò [quản trị viên].


(2) DB-based authentication:

Realm thay đổi lĩnh vực trên để jdbcRealm trong web.xml

  • 1) mn (mối quan hệ nhiều-nhiều giữa bảng người dùng và nhóm)

    SEC1111, Không thể tải nhóm cho người dùng lĩnh vực JDBC [tamas].

  • 2) tương tự cho 1-n (một-nhiều mối quan hệ giữa người sử dụng và các nhóm bảng)

    SEC1111, Không thể tải nhóm cho người dùng lĩnh vực JDBC [Tamas].

  • 3) tên nhóm trong cùng một bảng như tên người dùng và mật khẩu

    SEC1111, Không thể tải nhóm cho người dùng lĩnh vực JDBC [Tamas].

cấu hình Realm: (. Tôi cũng đã cố gắng rời khỏi "Gán Groups" trống hoặc để điền vào "mặc định" nhưng kết quả là như nhau)

Image had to be omitted, summary: 
JAAS context: jdbcRealm 
JNDI: jdbc/securityDataSource 
User Table: TBLUSERS 
User Name Column: USERNAME 
Password Column: PASSWORD 
Group Table: TBLGROUPS 
Group Name Column: GROUPNAME 
Assign Groups: default 
Digest Algorithm: none 

DB ER Diagram đối với mối quan hệ mn:

Hình ảnh phải được bỏ qua nhưng khi đền bù :-) bạn tìm thấy tập lệnh SQL bên dưới.

SQL Script: 
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL'; 

CREATE SCHEMA IF NOT EXISTS `jdbcrealm` ; 
USE `jdbcrealm` ; 

-- ----------------------------------------------------- 
-- Table `jdbcrealm`.`TBLUSERS` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `jdbcrealm`.`TBLUSERS` ; 
CREATE TABLE IF NOT EXISTS `jdbcrealm`.`TBLUSERS` (
    `USERID` INT NOT NULL AUTO_INCREMENT , 
    `USERNAME` VARCHAR(30) NOT NULL , 
    `PASSWORD` VARCHAR(45) NOT NULL , 
    UNIQUE INDEX `USERNAME_UNIQUE` (`USERNAME` ASC) , 
    PRIMARY KEY (`USERID`)) 

ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `jdbcrealm`.`TBLGROUPS` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `jdbcrealm`.`TBLGROUPS` ; 
CREATE TABLE IF NOT EXISTS `jdbcrealm`.`TBLGROUPS` (
    `GROUPID` INT NOT NULL AUTO_INCREMENT , 
    `GROUPNAME` VARCHAR(30) NOT NULL , 
    PRIMARY KEY (`GROUPID`)) 

ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `jdbcrealm`.`USERS_GROUPS` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `jdbcrealm`.`USERS_GROUPS` ; 
CREATE TABLE IF NOT EXISTS `jdbcrealm`.`USERS_GROUPS` (
    `USER_USERID` INT NOT NULL , 
    `GROUP_GROUPID` INT NOT NULL , 
    PRIMARY KEY (`USER_USERID`, `GROUP_GROUPID`) , 

    INDEX `fk_USER_has_GROUP_GROUP1` (`GROUP_GROUPID` ASC) , 
    INDEX `fk_USER_has_GROUP_USER` (`USER_USERID` ASC) , 
    CONSTRAINT `fk_USER_has_GROUP_USER` 
    FOREIGN KEY (`USER_USERID`) 
    REFERENCES `jdbcrealm`.`TBLUSERS` (`USERID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_USER_has_GROUP_GROUP1` 
    FOREIGN KEY (`GROUP_GROUPID`) 
    REFERENCES `jdbcrealm`.`TBLGROUPS` (`GROUPID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 

ENGINE = InnoDB; 

SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

Tôi sao chép ở đây một số liên kết thú vị, googled về chủ đề hữu ích cho tôi. Ban đầu, tôi đi theo cái thứ hai. Có lẽ những người khác cũng sẽ thấy chúng hữu ích.

Cảm ơn bạn đã đọc cho đến thời điểm này. lời chúc tốt đẹp,

Tamas



Phần 2 Cảm ơn bạn đã trả lời. Tôi đã tạo 2 người dùng và nhóm mới với mối quan hệ một-nhiều. Trên trang cấu hình cõi, tôi đặt tên bảng và các cột cho tên người dùng, pwd và nhóm. bình luận Matt cũng là phù hợp với các liên kết (xem dưới đây tôi không thể đăng nó ở đây)

[...] Thú vị phần ở đây là cho người sử dụng bảng và bảng nhóm I dùng v_user_role làm giá trị cho các bất động sản. v_user_role là chế độ xem cơ sở dữ liệu chứa cả thông tin người dùng và nhóm. Lý do tôi không trực tiếp sử dụng bảng người dùng bởi vì glassfish giả định rằng cả bảng người dùng lẫn bảng nhóm chứa một cột có chứa tên người dùng và có thể dẫn đến dữ liệu trùng lặp. [...]

-- ----------------------------------------------------- 
-- Table `jdbcrealm`.`user` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `jdbcrealm`.`user` ; 
CREATE TABLE IF NOT EXISTS `jdbcrealm`.`user` (
    `userid` VARCHAR(30) NOT NULL , 
    `password` VARCHAR(45) NOT NULL , 
    PRIMARY KEY (`userid`)) 
ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `jdbcrealm`.`group` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `jdbcrealm`.`group` ; 
CREATE TABLE IF NOT EXISTS `jdbcrealm`.`group` (
    `groupid` VARCHAR(30) NOT NULL , 
    `userid` VARCHAR(30) NOT NULL , 
    INDEX `fk_group_user1` (`userid` ASC) , 
    CONSTRAINT `fk_group_user1` 
    FOREIGN KEY (`userid`) 
    REFERENCES `jdbcrealm`.`user` (`userid`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

Các lỗi tương tự xuất hiện. Tôi đã cố gắng cũng theo cách mà tôi đặt một khóa chính trên groupid cột trong bảng nhóm nhưng tôi không có kinh nghiệm thay đổi từ quan điểm của câu hỏi.Nó cũng là thú vị mà tôi đã cố gắng để làm như vậy với 1 bảng trong đó tên người dùng, pwds, nhóm được đặt và cùng một lỗi đến.



Hướng tới các giải pháp và các giải pháp

Các ý kiến ​​từ Matt đã giúp rất nhiều, cảm ơn vì bài viết tuyệt vời này. Tóm lại, ngay từ đầu khi tôi viết câu hỏi liên quan đến xác thực dựa trên DB, rõ ràng là các nhóm người dùng không thể tải được. Điều này được chỉ ra bởi thông báo lỗi trong server.log.

Tuy nhiên, sự nghi ngờ của tôi hướng về các liên kết giữa các bảng và tên cột của chúng. Tuy nhiên, sau khi đơn giản hóa mô hình dữ liệu cho các thực thể nhóm người dùng, tôi không thể giải thích tại sao nó không hoạt động ngay cả với một bảng đơn giản có chứa người dùng, pwd và nhóm. Tôi tiếp tục điều tra theo hướng này. Tôi giả định rằng các tên cột cũng có thể ảnh hưởng đến điều này. Khi tôi áp dụng cấu hình của Matt, thông báo "không thể tải nhóm" biến mất khỏi server.log nhưng hiện tượng vẫn giữ nguyên. Do đó tôi giả định rằng các nhóm có thể đã được tải nhưng cũng có một vấn đề khác. Tôi đã sau đó cấu hình của Matt và bắt đầu thay đổi tên cột trở lại từng bước để tiếp cận cấu hình ban đầu nhưng "không thể tải nhóm" tin nhắn đã không xuất hiện trong nhật ký. Khi tôi sao chép các trường hợp với các thiết lập ban đầu của tôi và thông điệp tường trình đã không có, tôi biết rằng một cái gì đó là sai với việc đăng nhập nó bằng cách nào đó đã được tắt. Vì vậy, tôi bắt đầu điều tra toàn bộ cấu hình.

Khi tôi đã xem xét ứng dụng được triển khai, tôi đã chọn các bộ mô tả triển khai và tải chúng lên bảng điều khiển thủy tinh. web.xml là tất cả các quyền nó có cùng một nội dung tôi đã viết nhưng glassfish-web.xml có một nội dung hoàn toàn khác nhau! Nó được tạo ra như thể tôi đã không có glassfish-web.xml. Sau đó, tôi nhận thấy rằng glassfish-web.xml của tôi không được đặt trong thư mục WEB-INF. Tôi di chuyển nó ở đó và tạo ra một "sạch tất cả, xây dựng" và triển khai ứng dụng. Sau đó tôi quay trở lại khung nhìn db đại diện cho dữ liệu giữa TBLUSERS và TBLGROUPS trong một mối quan hệ nhiều-nhiều. Tôi thích giải pháp này nhiều nhất vì nó cho thấy hình ảnh rõ ràng nhất từ ​​quan điểm của dữ liệu. Tôi đặt các cột thích hợp trên trang cấu hình cõi. Tôi đã thử nghiệm nó với hai người dùng "tamas" và "arpi". "tamas" đã được thêm vào người dùng và nhóm quản trị trong khi "arpi" được thêm vào nhóm người dùng. Việc ánh xạ giữa các vai trò và các nhóm người dùng nằm trong tệp glassfish-web.xml. Quyền truy cập được cấp cho "tamas" cho cả tài nguyên người dùng và quản trị trong khi "arpi" chỉ nhận được quyền truy cập vào tài nguyên người dùng.

Cảm ơn sự giúp đỡ của bạn. Tamas

Trả lời

7

Từ cái nhìn đầu tiên, tôi sẽ phát hiện ra tên cột của bảng.

Từ kinh nghiệm của riêng tôi, tôi nhớ rằng cột người dùng trong bảng người dùng cần phải có cùng tên chính xác với cột người dùng trong bảng USER_GROUPS. Kết hợp được thực hiện theo tên cột.

Vì vậy, bảng USER_GROUPS cần cột USERNAME khớp với tên người dùng từ bảng TBLUSERS.

Lưu ý rằng bạn phải thay đổi quan hệ bảng của bạn cho việc này.

Có thể có hàng tá lý do khác nhưng bạn có thể thử.

Đây là cấu hình địa phương của tôi:

CREATE TABLE `user` (
    `LOGIN` varchar(32) NOT NULL, 
    `password` varchar(256) DEFAULT NULL, 
    PRIMARY KEY (`LOGIN`) 
) 

CREATE TABLE `group` (
    `IDGROUP` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`IDGROUP`) 
) 

CREATE TABLE `group_has_user` (
    `IDGROUP` int(11) NOT NULL, 
    `LOGIN` varchar(32) NOT NULL, 
    PRIMARY KEY (`IDGROUP`,`LOGIN`), 
    KEY `fk_group_has_user_user1` (`LOGIN`), 
    CONSTRAINT `fk_group_has_user_user1` FOREIGN KEY (`LOGIN`) 
    REFERENCES `user` (`LOGIN`) 
    ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `fk_group_has_user_group1` FOREIGN KEY (`IDGROUP`) 
    REFERENCES `group` (`IDGROUP`) 
    ON DELETE NO ACTION ON UPDATE NO ACTION 
) 

với các thiết lập sau đây trong GF quản trị giao diện điều khiển:

enter image description here

Đây là bản đồ bảo mật vai trò của tôi từ ánh nắng mặt trời-web.xml (now glassfish-web.xml):

<security-role-mapping> 
    <role-name>user</role-name> 
    <group-name>1</group-name> 
    </security-role-mapping> 
    <security-role-mapping> 
    <role-name>sponsor</role-name> 
    <group-name>2</group-name> 
    </security-role-mapping> 
    <security-role-mapping> 
    <role-name>admin</role-name> 
    <group-name>3</group-name> 
</security-role-mapping> 

Và tôi đã xác định an ninh-vai trò sau đây trong web.xml trực tiếp bên dưới login-config:

<security-role> 
    <description/> 
    <role-name>user</role-name> 
</security-role> 
<security-role> 
    <description/> 
    <role-name>sponsor</role-name> 
</security-role> 
<security-role> 
    <description/> 
    <role-name>admin</role-name> 
</security-role> 
+0

Hi Matt, Cảm ơn bạn đã trả lời của bạn. Tôi đã thay đổi các mối quan hệ bảng thành một-nhiều và thêm cùng một cột tên người dùng cho cả hai bảng. Thật không may, nó tạo ra cùng một lỗi. Trên thực tế, tôi cũng đã thử nó với một bảng ... – Tamas

+0

Xin chào Matt, Cảm ơn bạn đã trả lời. Tôi đã thay đổi các mối quan hệ bảng thành một-nhiều và thêm cùng một cột tên người dùng cho cả hai bảng. Thật không may, nó tạo ra cùng một lỗi. Trên thực tế, tôi cũng đã thử với một bảng ... Tôi đã tìm thấy một liên kết rất tốt: http://jugojava.blogspot.com/2011/02/jdbc-security-realm-with-glassfish-and.html cũng hỗ trợ ý tưởng của bạn. Tôi cũng đã làm theo mô tả trên liên kết này và tạo một khung nhìn trên các bảng gốc nhưng bị kẹt ở cùng một nơi: không thể tải nhóm ... Cảm ơn bạn rất nhiều vì đã trả lời, Tamas – Tamas

+0

Bạn có thể cập nhật cấu hình bảng của mình không trong câu hỏi của bạn? Sau đó, tôi có thể so sánh nó với giải pháp của riêng tôi (làm việc). –

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