gpt4 book ai didi

security - Struts2授权

转载 作者:行者123 更新时间:2023-11-28 22:22:07 30 4
gpt4 key购买 nike

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

当用户登录时,它应该被重定向到一个不同的 View ,这取决于它拥有的角色,然后如果他试图访问他的角色不允许的资源,应该显示一个错误页面。

这是我到目前为止尝试过的:

方法一:

身份验证方法:在 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。

授权方法:使用容器安全 (Tomcat) 通过 DataSourceRealm ,这允许我们连接到数据库并从需要在 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 操作,这是主要问题。一切都很完美,但在使用 Container 安全登录后,我找不到重定向的方法。

方法二:

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

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

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

其他计划

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

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

其他问题

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

非常感谢您花时间和帮助。

最佳答案

对于方法一的问题:你可以写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?

关于security - Struts2授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12552383/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com