Struts2授权

时间:2012-09-23 12:32:08

标签: security tomcat struts2 spring-security roles

我即将从大学毕业,需要在学校实施一个Web应用程序,一切都很完美,这需要在11月之前准备好,但我在处理安全方面遇到了麻烦。应用程序必须能够让不同的用户拥有一个或多个不同的角色(用户1:角色:学生;用户2:管理员,用户3:教授,老板)。

当用户登录时,应根据其所具有的角色将其重定向到不同的视图,然后如果他尝试访问不允许其角色的资源,则应显示错误页面。

这是我迄今为止所尝试过的:

方法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>

然后在自定义jsp上使用名称j_username和j_password以及j_security_check。

授权方法:通过DataSourceRealm使用容器安全性(Tomcat),允许我们连接到数据库,从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)

结果:每当我尝试访问受限区域时,例如/ members /(在安全约束内的web.xml中配置),它就会完美无缺,因此实现了授权目标

问题: 当我提交登录表单时,它会触发j_security_check,因此我无法触发Struts2 Action,它可以帮助我重定向,具体取决于用户角色这是主要问题。一切都很完美,但在登录Container安全后我无法找到重定向的方法。

方法2:

身份验证方法:一个LoginAction类,用于查询数据库并检查密码是否正确。它还会检查用户角色,在这里我们应该能够返回一个像&#34; admin&#34;或者#34; student&#34;并重定向到相应的index.jsp资源,但只有在允许用户只有一个角色但是可以有多个的情况下才能使用,所以应该如何构建视图取决于总用户角色?我们会返回什么字符串?

授权方法:我编写了一个自定义拦截器,它从会话中检索User对象(只有在用户成功通过身份验证后,此User对象才应在会话中),然后在此处执行授权逻辑。

问题: 无法找到根据多个角色构建视图的方法,而关于拦截器的问题是它只保护我的操作,因此授权目标已实现,但仅限于操作,这意味着我可以编写/学生/和URL在没有尝试授权的情况下会改为/students/index.jsp。

其他计划

我在想,也许我可以使用过滤器来实现授权(这样我可以保护动态和静态资源)但是我不知道这是否是一个很好的做法,因为我们已经配置了Struts2映射到/ *

的过滤器

我也在考虑可以使用 JAAS Spring Security ,但我不知道我是否可以实现此目的,验证,重定向角色和授权。我不想花更多时间来发现我无法做到我需要的东西,而且我只有很短的时间来完成这项工作。

其他问题

将jsp放在WEB-INF下真的是一个好习惯吗?如果是这样,我应该将struts.xml中对jsp的所有访问权限重写为WEB-INF / jsp / students / index.jsp? ( 例如 )。或者我应该坚持使用web.xml中定义的安全约束来避免直接访问/ jsp / * url模式?

非常感谢您提供所有时间和帮助。

1 个答案:

答案 0 :(得分:1)

对于方法1中的问题:您可以编写Struts2拦截器来实现您想要的目标。

对于Spring Security示例,请参阅我对此问题的回答https://stackoverflow.com/questions/12615354/how-to-implement-role-based-login/12629731#12629731

是的,将jsp放在WEB-INF文件夹下是一个好习惯。见Why put JSP in WEB-INF?