Val*_*lva 22 jsf login-control jsf-2 servlet-filters
我希望在用户登录系统后控制访问权限.
例如:
administrator : can add, delete and give rights to employee
employee : fill forms only
...
Run Code Online (Sandbox Code Playgroud)
因此,在知道用户具有哪些权限后,检查数据库,我想限制该用户可以看到和执行的操作.有一个简单的方法吗?
编辑
@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() {
}
}
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 34
嗯,这是一个相当广泛的主题.当您开始使用自制认证时,我将针对自制授权进行定位.
如果模型设计合理,Java/JSF中的角色检查本身就相对简单.假设一个用户可以拥有多个角色(在现实世界的应用程序中通常就是这种情况),你最终会喜欢这样的东西:
public class User {
private List<Role> roles;
// ...
public boolean hasRole(Role role) {
return roles.contains(role);
}
}
Run Code Online (Sandbox Code Playgroud)
public enum Role {
EMPLOYEE, MANAGER, ADMIN;
}
Run Code Online (Sandbox Code Playgroud)
以便您可以在JSF视图中按如下方式检查它:
<h:selectManyCheckbox value="#{user.roles}" disabled="#{not user.hasRole('ADMIN')}">
<f:selectItems value="#{Role}" />
</h:selectManyCheckbox>
Run Code Online (Sandbox Code Playgroud)
<h:commandButton value="Delete" rendered="#{user.hasRole('ADMIN')}" />
Run Code Online (Sandbox Code Playgroud)
并在您的过滤器中:
String path = req.getRequestURI().substring(req.getContextPath().length());
if (path.startsWith("/integra/user/admin/") && !user.hasRole(Role.ADMIN)) {
res.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
Run Code Online (Sandbox Code Playgroud)
最难的部分是将这个Java模型转换为理智的数据库模型.根据具体的业务需求,有几种不同的方式,每种方式都有自己的(dis)优势.或者您可能已经拥有了一个基于Java模型的数据库模型(因此,您需要自下而上设计)?
无论如何,假设您正在使用JPA 2.0(您的问题历史至少证实了这一点)并且您可以自上而下地设计,最简单的方法之一是将该roles属性映射为@ElementCollection一个user_roles表.由于我们使用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)
)
Run Code Online (Sandbox Code Playgroud)
然后将其映射如下:
@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;
Run Code Online (Sandbox Code Playgroud)
这基本上就是你需要改变你的User实体.
下一步家酿认证(登录/注销)和授权(角色检查),还有的Java EE提供容器管理的认证,使用它可以通过登录j_security_check或者HttpServletRequest#login(),通过过滤HTTP请求<security-constraint>中web.xml,检查登录用户通过#{request.remoteUser}和其角色由#{request.isUserInRole('ADMIN')}等
然后有几个第三方框架,如PicketLink,Spring Security,Apache Shiro等.但这都是不可能的:)
| 归档时间: |
|
| 查看次数: |
26066 次 |
| 最近记录: |