如何在struts2上应用基于角色的安全性

时间:2013-02-15 04:01:16

标签: struts2 spring-security

您好我将在我的struts2应用程序上应用基于角色的安全性,但找不到任何有用的教程,其中大多数都在xml文件中定义了用户名和密码,但我正在寻找具有数据库访问权限的那个。

我想做什么:

当用户登录访问数据库进行授权,然后根据其角色提供对应用程序的不同资源的访问权限时,有一个登录页面。

1 个答案:

答案 0 :(得分:1)

此安全性有两个级别  1.服务器端  2.客户端

最初,您必须在数据库中设置一个表,即task_permissions,其中说明了基于角色的任务权限。

然后这个方法将帮助你在服务器端

private boolean isTaskOpAllowed(String taskId, String operation) throws SQLException {

    String taskAllowedSql = "select"+operation+"from task_permissions where  role_id = ? and task_id = ?";
    PreparedStatement pstmt = null;
    ResultSet rst = null;
    boolean allowed = false;
    Connection conn = <make db connection>
    String role = <take role of user from session>
    try {
        pstmt = conn.prepareStatement(taskAllowedSql);
        pstmt.setString(1, roleId);
        pstmt.setString(2, taskId);
        rst = pstmt.executeQuery();

        if (rst.next()) {
            allowed = rst.getString(1);
        }
    } catch (SQLException se) {
        throw se;
    } finally {
                   cleanUpDbConnection(pstmt, rst);
    }
    return allowed;
}

在jsp上你可以在不同的模块上添加这个检查,所以在渲染之前会调用上面的函数并告诉你是否向这个角色用户显示这个信息

<s:if test="%{@<packagename>.TaskSecurityHandler@isTaskOpAllowed(task,operation)}">

修改 另一种方法是缓存基于任务的权限的结果,每次查询到该缓存,它将节省数据库命中。

使用属性制作RoleTaskPrmsBean.java String role;
String task;
String operation1;
String operation2;
等等。 现在在系统或服务器启动时从db task_permissions表中获取所有记录,并使该类的多个对象将它们放在映射中key:task+role。现在,每当上述函数运行时,您可以查询该Map而不是db。