gpt4 book ai didi

jsf - 如何控制 JSF 中的访问和权限?

转载 作者:行者123 更新时间:2023-12-04 13:59:47 28 4
gpt4 key购买 nike

我想在用户登录我的系统后控制访问。

例如:

administrator : can add, delete and give rights to employee
employee : fill forms only
...

因此,在知道用户拥有哪些权限后,检查数据库,我想限制该用户可以看到和执行的操作。
有一种简单的方法可以做到这一点吗?

编辑
@WebFilter("/integra/user/*")
public class LoginFilter implements Filter {

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest) request;
Authorization authorization = (Authorization) req.getSession().getAttribute("authorization");

if (authorization != null && authorization.isLoggedIn()) {
// User is logged in, so just continue request.
chain.doFilter(request, response);
} else {
// User is not logged in, so redirect to index.
HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect(req.getContextPath() + "/integra/login.xhtml");
}
}

// You need to override init() and destroy() as well, but they can be kept empty.


@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void destroy() {
}
}

最佳答案

嗯,这是一个相当广泛的主题。当您开始使用自制身份验证时,我将针对自制授权的答案。

如果模型设计合理,Java/JSF 中的角色检查本身就相对简单。假设一个用户可以有多个角色(在现实世界的应用程序中经常是这种情况),你最终希望得到类似的结果:

public class User {

private List<Role> roles;

// ...

public boolean hasRole(Role role) {
return roles.contains(role);
}

}

public enum Role {

EMPLOYEE, MANAGER, ADMIN;

}

以便您可以在 JSF View 中按如下方式检查它:

<h:selectManyCheckbox value="#{user.roles}" disabled="#{not user.hasRole('ADMIN')}">
<f:selectItems value="#{Role}" />
</h:selectManyCheckbox>

<h:commandButton value="Delete" rendered="#{user.hasRole('ADMIN')}" />

并在您的过滤器中:

String path = req.getRequestURI().substring(req.getContextPath().length());

if (path.startsWith("/integra/user/admin/") && !user.hasRole(Role.ADMIN)) {
res.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}

最困难的部分是将这个 Java 模型转换为一个健全的 DB 模型。根据具体的业务需求,有几种不同的方式,每种方式都有自己的(缺点)优势。或者,您可能已经有一个 DB 模型,您的 Java 模型必须以此为基础(因此,您需要自下而上进行设计)?

无论如何,假设您使用的是 JPA 2.0(您的问题历史至少证实了这一点)并且您可以自上而下设计,最简单的方法之一是映射 roles作为 @ElementCollection 的属性(property)反对 user_roles table 。因为我们正在使用 Role枚举,第二个 role表不是必需的。同样,这取决于具体的功能和业务需求。

在通用 SQL 术语中, user_roles表可以是这样的:

CREATE TABLE user_roles (
user_id BIGINT REFERENCES user(id),
role VARCHAR(16) NOT NULL,
PRIMARY KEY(user_id, role)
)

然后按如下方式映射:
@ElementCollection(targetClass=Role.class, fetch=FetchType.EAGER)
@Enumerated(EnumType.STRING)
@CollectionTable(name="user_roles", joinColumns={@JoinColumn(name="user_id")})
@Column(name="role")
private List<Role> roles;

这基本上就是您需要在 User 中更改的全部内容。实体。

除了自制的身份验证(登录/注销)和授权(角色检查)之外,还有提供的 Java EE container managed authentication您可以使用它 login by j_security_check or HttpServletRequest#login() , filter HTTP requests by <security-constraint> in web.xml , check the logged-in user by #{request.remoteUser} its roles by #{request.isUserInRole('ADMIN')} , 等等。

然后还有 PicketLink等几个第三方框架, Spring Security , Apache Shiro等。但这完全是不可能的:)

关于jsf - 如何控制 JSF 中的访问和权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12516349/

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