Struts2 授权

Posted

技术标签:

【中文标题】Struts2 授权【英文标题】:Struts2 Authorization 【发布时间】:2012-09-15 03:59:21 【问题描述】:

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

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

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

方法一:

认证方式:在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),它允许我们连接到数据库并从需要映射到 server.xml 的 2 个表中获取用户和与他关联的角色:

<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 安全登录后找不到重定向的方法。

方法二:

Authentication Method:一个LoginAction 类,用于查询数据库并检查密码是否正确。它还检查用户角色,在这里我们应该能够返回像“admin”或“student”这样的字符串并重定向到适当的 index.jsp 资源,但只有在允许用户拥有只有一个角色,但他们可以有很多,那么应该如何根据用户角色总数构建视图?我们会返回什么字符串?

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

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

其他计划

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

我也在寻找可以使用 JAASSpring Security 但我不知道我是否可以实现这一点,身份验证,基于角色的重定向并授权。我不想再花几个小时来发现我不能做我需要做的事情,而且我只有很短的时间来完成这个。

其他问题

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

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

【问题讨论】:

使用 Spring Security,一旦你授权你的用户,你可以告诉 Spring Security 哪个类调用成功或失败,对我来说它更好更灵活,不需要重新发明*** 【参考方案1】:

针对方法一的问题:你可以写Struts2的拦截器来实现你想要的。

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

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

【讨论】:

以上是关于Struts2 授权的主要内容,如果未能解决你的问题,请参考以下文章

struts2 之 struts2简介,struts2开发步骤,struts2详细配置,struts2执行流程

Struts2标签库

Struts2框架使用之struts2的验证框架

Struts2学习笔记

Struts2学习笔记

struts2系列:struts2参数传递错误struts2的输入错误验证