2011-01-20 41 views
15

Làm cách nào để hiển thị các thành phần JSF dựa trên vai trò của người dùng đã đăng nhập? Tôi biết bối cảnh bên ngoài cho thấy các hiệu trưởng, nhưng làm thế nào tôi nên làm việc rendering đúng trong JSF? Trong JSP nó sẽ là một cái gì đó giống nhưLàm cho thành phần JSF dựa trên vai trò người dùng

<% isUserInRole(Roles.ADMIN) { %> 
<button>Edit!</button> 
<% } %> 

Làm cách nào để viết điều này trong JSF theo cách tốt nhất có thể? Đoán tốt nhất của tôi là thuộc tính kết xuất với phương thức của bean sao lưu trả về boolean, nhưng điều đó sẽ giới thiệu một bean sao lưu không liên quan nếu tôi phải hiển thị một số mục điều hướng chỉ dành cho quản trị viên ...

Glassfish V3.1, JSF 2.x

+1

JSF 1.x hoặc 2.x? – BalusC

+0

2.x, Glassfish 3.1 – TC1

+0

Trong tương lai, vui lòng thêm thẻ '[jsf-2.0]' để chỉ ra rằng :) – BalusC

Trả lời

31

Nếu web.xml của bạn được khai báo là Servlet 3.0 (mà ngầm liên quan đến JSP/EL 2,2)

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 

sau đó bạn có thể mang lợi ích của việc có thể gọi các phương pháp với đối số trong EL như là ExternalContext#isUserInRole():

rendered="#{facesContext.externalContext.isUserInRole('ADMIN')}" 

Lưu ý rằng điều này yêu cầu thùng chứa có khả năng Servlet 3.0, nhưng vì bạn đang sử dụng Glassfish 3 (hỗ trợ Servlet 3.0), nó sẽ hoạt động mà không có bất kỳ vấn đề nào.

Cũng lưu ý rằng nếu bạn đang sử dụng Facelets thay vì JSP, sau đó bạn đã là HttpServletRequest sẵn như #{request} tại EL, cho phép bạn biểu ngắn sau:

rendered="#{request.isUserInRole('ADMIN')}" 
+0

Nó thực sự là Servlet 3.0, nhưng bằng cách nào đó trong số tất cả các fuss của kỳ thi tôi quên họ đã thêm các cuộc gọi phương thức để JSF ... Cảm ơn rất nhiều :) – TC1

+1

Nó không cụ thể JSF, đó là EL (những '# {}' mọi thứ). Nếu bạn chạy JSF 2.0 trên ví dụ Servlet 2.5 (có nghĩa là JSP/EL 2.1), nó sẽ không hoạt động. Nó được giới thiệu trong JSP/EL 2.2. – BalusC

+0

Tôi đã xác định vai trò cho mỗi người dùng bằng cách sử dụng JDBC Realm. Nhưng biểu thức trên luôn trả về "false" cho bất kỳ người dùng nào. Tôi có cần phải thêm một số thứ khác để làm cho nó hoạt động không? – wasimbhalli

0

Vai trò cửa hàng trong thuộc tính phiên và chỉ so sánh với thuộc tính được hiển thị.

ví dụ: rendered="#{yoursessionbean.userRole == Roles.ADMIN}"

+0

Đó là một trong những ý tưởng của tôi lúc đầu, nhưng người dùng có thể có số lượng vai trò vô hạn dựa trên các nhóm. Sẽ chỉ thực sự hoạt động nếu người dùng chỉ có một vai trò ... – TC1

+0

@ TC1 - đồng ý, sau đó bạn sẽ phải thực hiện cuộc gọi phương thức hoặc chờ nếu có bất kỳ giải pháp nào khác đến. – niksvp

5

Để trả lời @wasimbhalli, có hai lý do tôi thấy rằng biểu thức sẽ luôn trả về false:

  1. Tên vai trò phân biệt chữ hoa chữ thường. rendered="#{facesContext.externalContext.isUserInRole('ADMIN')}" có thể trả về false, nhưng hãy thử rendered="#{facesContext.externalContext.isUserInRole('admin')}" hoặc rendered = "# {facesContext.externalContext.isUserInRole ('Admin')}".

  2. Bạn phải xác định vai trò của mình trong cả hai web.xml (hoặc dưới dạng chú thích) và ánh xạ nó trong glassfish-web.xml.

Sau đây là làm thế nào để xác định một vai trò trong việc web.ml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 
    <security-role> 
    <role-name>admin</role-name> 
    </security-role> 
</web-app> 

Sau đây là cách để lập bản đồ nhóm xác thực cho vai diễn trong glassfish-web.xml.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> 
<glassfish-web-app> 
    <security-role-mapping> 
    <role-name>admin</role-name> <!-- name defined in web.xml or annotations --> 
    <group-name>admin</group-name><!-- name from authentication mechanism --> 
    </security-role-mapping> 
</glassfish-web-app> 

Trong thử nghiệm của tôi, cần phải lập bản đồ ngay cả khi tên giống nhau, như tôi thấy trong mã ví dụ của mình. Cũng trong thử nghiệm của tôi, tôi đã cố gắng chỉ xác định ánh xạ và chỉ để xác định vai trò trong web.xml và không hoạt động. Tôi cần cả hai, như chỉ định tên vai trò trong trường hợp chính xác.

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