2009-02-05 29 views
15

Tôi là một số những gì bị mất là tại sao mùa xuân không thực thi @Secured ("ROLE_USER") trên giao diện dịch vụ của tôi. Bộ điều khiển của tôi được thiết lập bằng chú thích.mùa xuân không thực thi chú thích bảo mật phương pháp

Một ví dụ về giao diện dịch vụ của tôi

public interface MyServiceManager { 

    @Secured("ROLE_USER") 
    public void delete(int cid); 

    @RolesAllowed({"ROLE_USER"}) 
    public Contact getContact(int contactId); 
} 

tôi bảo mật ngữ cảnh:

<global-method-security secured-annotations="enabled" jsr250-annotations="enabled"> 
</global-method-security> 

<http auto-config="true" > 
    <intercept-url pattern="/secure/**" access="ROLE_SUPERVISOR" /> 
    <intercept-url pattern="/addcontact**" access="IS_AUTHENTICATED_REMEMBERED" /> 
    <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 

    <concurrent-session-control max-sessions="1" 
     exception-if-maximum-exceeded="true"/> 
    <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1"/> 
    <logout logout-success-url="/welcome.do" logout-url="/logout"/> 
</http> 
    <authentication-provider> 
    <password-encoder hash="md5"/> 
    <user-service> 
     <user name="rod" password="a564de63c2d0da68cf47586ee05984d7" authorities="ROLE_SUPERVISOR, ROLE_USER, ROLE_TELLER" /> 
    </user-service> 
</authentication-provider> 

Trả lời

7

Bạn có báo cáo kết quả

<global-method-security secured-annotations="enabled" jsr250-annotations="enabled" /> 

trong file cấu hình tương tự như một trong những bạn định nghĩa bean MyServiceManager? Tôi đã gặp vấn đề tương tự cho đến khi tôi bật gỡ lỗi cho org.springframework, và nhận thấy rằng bảo mật mùa xuân chỉ được áp dụng trên cùng một tệp như là các phương thức mà bảo mật phương pháp toàn cầu đã được xác định trong.

+0

Tôi đang nhập tệp security-context.xml và datasource-context.xml vào applicationContext.xml. Di chuyển lên dường như khắc phục vấn đề về vai trò bảo mật đường dẫn url. nhưng không phải là vấn đề bảo mật của phương thức. – IaCoder

+0

Vâng, phần quan trọng là bạn có phương thức bảo mật toàn cục trong cùng ngữ cảnh mùa xuân như các thành phần. –

1

Thử đặt chú thích trên thực hiện lớp thay vì giao diện và xem nếu nó hoạt động. Tôi đã làm điều đó trên một dự án gần đây vì tôi cũng đang sử dụng thuộc tính @Transactional trên lớp dịch vụ của mình và tài liệu Spring khuyên bạn nên đặt các lớp đó lên lớp chứ không phải giao diện. Tôi không biết liệu vấn đề tương tự có thể áp dụng cho @Secured hay không, nhưng tôi muốn giữ chú thích ở cùng một nơi. Xem Spring Docs

Về câu trả lời của Kent Lai ... đó là một ý tưởng hay ... đảm bảo rằng tệp cấu hình bảo mật của bạn thực sự được Spring bao gồm.

2

Sau khi nghiên cứu thêm về vấn đề này, tôi đã đi đến kết luận/giải pháp sau đây. Tôi không chắc chắn nếu nó là chính xác 100% .. nhưng nó hoạt động.

Tôi đặt tất cả cấu hình của mình vào tệp dispatcher-servlet.xml. Vì vậy, thay vì có một disptacher-servlet.xml và application-context.xml. Dispatcher-servlet.xml được tải bởi ứng dụng (contextConfigLocation). Trong tệp dispatcher-servlet.xml tôi nhập tệp tin security-context.xml và datasource-context.xml của mình. Afer rằng, tất cả mọi thứ hoạt động.

2

Tôi gặp vấn đề tương tự. Sử dụng thông tin từ câu trả lời của Kent Lai ở đây, tôi đã có thể sửa chữa nó.

tôi đặt yếu tố <global-method-security> trong app-servlet.xml của tôi nhưng vẫn giữ các định nghĩa an ninh tách trong security.xml, nơi web.xmlcontextConfigLocation cho app-servlet.xmlsecurity.xml.

Hoạt động như một sự quyến rũ ngay bây giờ!

+0

Cách tôi hiểu điều này có chút dư thừa để xác định tệp app-servlet.xml của bạn như là một phần của contextConfigLocation. Nếu bạn sử dụng DispatcherServlet, nó sẽ tải servletname-servlet.xml của bạn, kế thừa WebApplicationContext. Trong trường hợp này có vẻ như với tôi rằng bean của bạn sẽ được tạo ra lần đầu tiên trong WebApplicationContext của bạn bởi ContextLoader của bạn và sau đó được ghi đè với cùng một định nghĩa khác theo DispatcherServlet của bạn. – Sam

+0

Chà, tôi sẽ phải kiểm tra điều đó. Cảm ơn! –

+0

@Sam và @Joe Thực ra nó không thừa vì họ làm những việc riêng biệt. Nếu bạn đặt tuyến -servlet.xml, một ngữ cảnh ứng dụng con sẽ được tạo ra có cha mẹ là WebApplicationContext. @ Joe có lẽ đã nhận nó để làm việc vì anh ta không có bối cảnh con (app-servlet và bảo mật trong cùng một bối cảnh). –

1

Bạn có sử dụng một cái gì đó như thế này trong web.xml của bạn

<servlet> 
    <servlet-name>name</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/webmvc-config.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Tôi không chắc chắn lý do tại sao, nhưng nếu tôi sử dụng DispatcherServlet tôi đã không thể thực thi các chú thích an

4

Trong trường hợp của tôi , vị trí chính xác của tuyên bố này:

<global-method-security secured-annotations="enabled" > 

được chứng minh là rất quan trọng. Đảm bảo rằng bạn đặt nó sau bạn khai báo nên quét và sử dụng các lớp nào làm bộ điều khiển.

<context:component-scan base-package="com.test.controller" /> 

Đây là cách để đảm bảo rằng các chú thích @Secured cũng sẽ nhận được vào trò chơi

+12

Nó không quan trọng đến mức sau khi quét thành phần, nó chỉ phải ở trong cùng một tệp! –

0

Tôi có vấn đề này như vậy. Sau khi tôi thêm:

<context:annotation-config /> 

trong tệp spring-security.xml của tôi, nó biến mất.

Hy vọng điều này sẽ giúp ai đó :)

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