我即將大學與需要在學校實施的Web應用程序就要畢業了,一切工作完美,這需要在11月前準備好,但我在考慮安全性的照顧真正的麻煩。應用程序必須能夠讓不同的用戶擁有一個或多個不同的角色,(user1:roles:student; user 2:admin,user 3:professor,boss)。Struts2的授權
當它在用戶登錄應視它,然後,如果他試圖訪問不允許他的角色資源的角色被重定向到一個不同的看法,一個錯誤頁面應該顯示。
這是我到目前爲止已經試過:
方法1:
身份驗證方法:在web.xml中指定爲
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
</form-login-config>
</login-config>
然後使用名稱爲j_username和爲j_password以及自定義jsp上的j_security_check。
授權方法:集裝箱安全(Tomcat)的通過DataSourceRealm使用至極讓我們連接到數據庫,並得到了用戶和他一起從2個表需要在server.xml映射關聯的角色:
<Resource auth="Container" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" maxActive="100" maxIdle="30" maxWait="1000" name="jdbc/sstt" password="pass" type="javax.sql.DataSource" url="jdbc:sqlserver://localhost;databaseName=BDTT" username="sa"/>
web.xml中:
<security-constraint>
<web-resource-collection>
<web-resource-name>Students Only</web-resource-name>
<url-pattern>/student/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>student</role-name>
</auth-constraint>
</security-constraint>
// Same mapping for professor, admin, and boss (/professor/* maps to professor role)
結果:每當我試圖訪問受限區域,例如,/構件/(在一個安全約束內的web.xml中配置)它WOU ld工作很完美,所以授權目標已經實現。
問題: 當我提交它激發了j_security_check登錄表單,所以我不能夠觸發一個Struts2的行動,可以幫助我重定向取決於用戶角色這是主要的問題。一切都很完美,但我無法找到用Container安全登錄後重定向的方法。
方法2:
身份驗證方法:查詢數據庫和檢查,如果密碼是正確的一個LoginAction類。它還會檢查用戶角色,在這裏我們應該能夠返回如「管理員」或「學生」的字符串,然後重定向到相應的index.jsp資源,而是將工作只有當用戶被允許只有一個的角色,但他們可以有很多,所以應該如何的看法取決於總用戶角色構建?我們會返回什麼字符串?
授權方法:我寫了一個自定義的Interceptor,它從會話中檢索User對象(只有當用戶認證成功時,此用戶對象才應該在會話中),然後在此處執行授權邏輯。
問題: 無法找到一種方法來構造取決於幾個角色的視圖,以及有關攔截的問題是,它不僅保護我的動作,所以達到了授權的目標,但只有在行動中,意味着我可以編寫/ students /並且URL甚至不需要授權即可更改爲/students/index.jsp。
其他計劃
我在想,也許我可以使用過濾器來實現的授權(這樣我可以同時保護動態和靜態資源),但我不知道這是否會是一個好做法,因爲我們已經配置了Struts2的過濾器映射到/ *
我也在找,我可以用JAAS或春季安全,但我不知道如果我能做到這一點,身份驗證,基於重定向關於角色和授權。我不想花更多的時間來發現我不能做我需要的東西,而且我只用很短的時間來完成這個任務。
其他問題
,這真是個很好的做法,把JSP在WEB-INF?如果是的話,我應該將struts.xml中的所有對jsp的訪問重寫爲WEB-INF/jsp/students/index.jsp? ( 例如 )。或者我應該堅持在web.xml中定義的安全約束,以避免直接訪問/ jsp/* url模式?
非常感謝您提前爲您的所有時間和幫助。
與Spring安全一起使用,一旦您授權您的用戶使用它,您可以告訴Spring安全成功或失敗時調用哪個類,對我而言,它更好更靈活,無需重新發明輪盤 –