2011-06-20 54 views
7

Tôi có một ứng dụng Grails đơn giản với plugin Spring Security Core được cài đặt và hoạt động tốt. Tuy nhiên, tôi đã không tìm thấy bất kỳ giải pháp nào cho vấn đề với việc cập nhật quyền hạn của người dùng đã đăng nhập trong ngữ cảnh bảo mật. Tôi không nói về việc cập nhật chi tiết của người dùng hiện tại (nghĩa là springSecurityService.reauthenticate).Plugin Grails Spring Security - sửa đổi quyền truy cập đăng nhập của người dùng

Vấn đề của tôi là: Tôi có một ứng dụng quản lý người dùng đơn giản với các quyền hạn ROLE_ADMIN và ROLE_USER được sử dụng. Bây giờ, tôi có 2 quản trị viên đăng nhập cùng một lúc (với quyền hạn ROLE_ADMIN) từ các máy tính khác nhau và một quản trị viên quyết định thay đổi thẩm quyền của quản trị viên khác từ ROLE_ADMIN thành ROLE_USER.

Làm cách nào để cập nhật người dùng và vai trò để người dùng được sửa đổi (với vai trò ROLE_USER mới) không thể thực hiện bất kỳ hành động cấp ROLE_ADMIN nào và được chuyển hướng đến các trang cấp ROLE_USER ngay lập tức? Có cách nào để cập nhật bối cảnh bảo mật vì vậy tôi không phải thực hiện kiểm tra bổ sung trong tất cả các hành động của bộ điều khiển liệu các quyền của người dùng đã đăng nhập đã bị thay đổi chưa? Tôi có thể sử dụng tài sản cahceUsers cho điều đó không? Tôi đã không sửa đổi cacheUsers và trong sự hiểu biết của tôi, nó là false theo mặc định. Nêu tôi sai vui long chân chỉnh tôi.

EDIT: Trình tự đó là gây ra vấn đề là

  1. Administrator "A" sẽ thay đổi quản trị "B" và đặt ra một vai trò mới (ROLE_USER) cho quản trị viên "B"

  2. mã gọi PersonRole.removeAll(personInstanceB) and PersonRole.create(personInstanceB, roleAdmin) và mọi thứ được cập nhật thường là

  3. đồng thời Quản trị viên "B" đã được đăng nhập khi quyền lực của họ được sửa đổi. Quản trị viên "B" có thể tiếp tục làm việc trên các trang bị hạn chế ROLE_ADMIN cho đến khi họ đăng xuất và đăng nhập mới. Chỉ khi đó chính quyền mới được cập nhật và Quản trị viên "B" có vai trò mới (ROLE_USER)

  4. Tôi muốn Quản trị viên "B" được chuyển hướng đến trang ROLE_USER khi người dùng được cập nhật vai trò mới và không chỉ sau khi đăng xuất/login

  5. gọi springSecurityService.reauthenticate personInstanceB.username) khiến Quản trị viên "A" được "đăng nhập" làm Quản trị viên "B" để điều này không hoạt động.

Bất kỳ ý tưởng nào cũng sẽ được hoan nghênh. Tôi có thể đã bỏ lỡ một cái gì đó đơn giản ở đây nhưng tôi không có ý tưởng những gì các giải pháp sẽ được.

Chúc mừng, mizzzto

Trả lời

11

Đây là chưa được kiểm tra nhưng cung cấp cho nó một thử

Trong lớp điều khiển/dịch vụ của bạn,

... 

User user = User.get(springSecurityService.principal.id) //get the user 
Role adminRole = //get or create the admin Role 
UserRole.remove user, role // remove admin Role 

Role userRole = // get or create the user Role 
UserRole.create user, role //add the user Role 

... 

if (!user.hasErrors() && user.save(flush: true)) { 
    springSecurityService.reauthenticate user.username // refresh the users security deatils 
} 

.... 

EDIT

Đó là rõ ràng hơn rất nhiều bây giờ.

Điều tôi sẽ làm ở đầu đầu của tôi là sử dụng chức năng chuyển đổi người dùng.thấy Switch User

  • Trước tiên, bạn thiết lập các thuộc tính useSwitchUserFilter để true
  • Nó được khuyên bạn thực hiện một vai trò mới (ví dụ ROLE_SWITCH_USER) cho đặc quyền này.
  • trong trang quản trị của bạn ở đâu đó,

    <sec:ifAllGranted roles='ROLE_SWITCH_USER'> 
        <form action='/j_spring_security_switch_user' method='POST'> 
         Switch to user: <input type='text' name='j_username'/> <br/> 
         <input type='submit' value='Switch'/> 
        </form> 
    </sec:ifAllGranted> 
    
  • đăng nhập như người dùng mà bạn muốn chỉnh sửa sử dụng tên tài khoản tại
  • thay đổi các thiết lập vai trò của mình bằng cách thực hiện một cuộc gọi đến adminToUser() phương pháp dưới đây (ví dụ)
  • chuyển về người dùng ban đầu
  • Xong.

- Bạn có thể sử dụng biểu mẫu mã câu trả lời đầu tiên để tạo phương thức trong bộ điều khiển hoặc dịch vụ của bạn để có userInstance và thay đổi vai trò từ quản trị viên sang người dùng.

def adminToUser(user, adminRole, userRole){ 
    UserRole.remove user, adminRole 
    UserRole.create user, userRole 
    if (!user.hasErrors() && user.save(flush: true)) { 
     springSecurityService.reauthenticate user.username 
    } 
} 
+0

Hi, cảm ơn bạn đã trả lời. Trước khi đăng câu hỏi của tôi, tôi đã làm như bạn đã mô tả. Tuy nhiên, điều này có nghĩa rằng nếu bạn là quản trị viên và bạn cập nhật quyền quản trị của một quản trị viên khác -> thì hãy gọi springSecurityService.reauthenticate user.username sẽ khiến phiên được cập nhật với thông tin đăng nhập của người dùng đã sửa đổi. Và điều đó có nghĩa là bạn đã "đăng nhập" với tư cách là người dùng bạn đã sửa đổi. Tôi không muốn điều đó :) Tôi sẽ chỉnh sửa bài đăng của mình để làm rõ hơn về những gì tôi đang theo dõi. – mizzzto

+0

@mizzzto xem EDIT! – gotomanners

+0

cảm ơn rất nhiều, dường như đang hoạt động tốt, rất đơn giản nhưng rất mạnh mẽ! :) Mặc dù, có thực sự cần phải có một số cách dễ dàng hơn để thông báo cho người dùng sửa đổi rằng chính quyền của họ đã được thay đổi trong khi người dùng đăng nhập. Tôi cần phải nhận được để dưới cùng này :) – mizzzto

6

Tôi đã giải quyết vấn đề này bằng reauthenticating hai lần:

Lưu tên của quản trị viên được demoting người dùng khác:

def originalUserName = springSecurityService.principal.name 
springSecurityService.reauthenticate user.username 
springSecurityService.reauthenticate originalUserName 
Các vấn đề liên quan