权限模块_使用权限_显示有权限的链接_思路分析_拦截验证每个请求的权限_完善权限的分类_一些细节

权限模块__使用权限__显示有权限的链接1__思路分析

实现功能

导入源文件,找到AnchorTag.java类复制到工程中

AnchorTag.java

package org.apache.struts2.views.jsp.ui;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;

import org.apache.struts2.components.Anchor;
import org.apache.struts2.components.Component;

import cn.itcast.oa.domain.User;

import com.opensymphony.xwork2.util.ValueStack;

/**
 * @see Anchor
 */
public class AnchorTag extends AbstractClosingTag {

    private static final long serialVersionUID = -1034616578492431113L;

    protected String href;
    protected String includeParams;
    protected String scheme;
    protected String action;
    protected String namespace;
    protected String method;
    protected String encode;
    protected String includeContext;
    protected String escapeAmp;
    protected String portletMode;
    protected String windowState;
    protected String portletUrlType;
    protected String anchor;
    protected String forceAddSchemeHostAndPort;

    @Override
    public int doEndTag() throws JspException {
        // 当前登录用户
        User user = (User) pageContext.getSession().getAttribute("user");

        // 当前准备显示的链接对应的权限URL
        // >> 在开头加上‘/‘
        String privUrl = "/" + action;

        if (user.hasPrivilegeByUrl(privUrl)) {
            return super.doEndTag(); // 正常的生成并显示超链接 标签,并继续执行页面中后面的代码
        } else {
            return EVAL_PAGE; // 不生成与显示超链接 标签,只是继续执行页面中后面的代码
        }
    }

    public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
        return new Anchor(stack, req, res);
    }

    protected void populateParams() {
        super.populateParams();

        Anchor tag = (Anchor) component;
        tag.setHref(href);
        tag.setIncludeParams(includeParams);
        tag.setScheme(scheme);
        tag.setValue(value);
        tag.setMethod(method);
        tag.setNamespace(namespace);
        tag.setAction(action);
        tag.setPortletMode(portletMode);
        tag.setPortletUrlType(portletUrlType);
        tag.setWindowState(windowState);
        tag.setAnchor(anchor);

        if (encode != null) {
            tag.setEncode(Boolean.valueOf(encode).booleanValue());
        }
        if (includeContext != null) {
            tag.setIncludeContext(Boolean.valueOf(includeContext).booleanValue());
        }
        if (escapeAmp != null) {
            tag.setEscapeAmp(Boolean.valueOf(escapeAmp).booleanValue());
        }
        if (forceAddSchemeHostAndPort != null) {
            tag.setForceAddSchemeHostAndPort(Boolean.valueOf(forceAddSchemeHostAndPort).booleanValue());
        }
    }

    public void setHref(String href) {
        this.href = href;
    }

    public void setEncode(String encode) {
        this.encode = encode;
    }

    public void setIncludeContext(String includeContext) {
        this.includeContext = includeContext;
    }

    public void setEscapeAmp(String escapeAmp) {
        this.escapeAmp = escapeAmp;
    }

    public void setIncludeParams(String name) {
        includeParams = name;
    }

    public void setAction(String action) {
        this.action = action;
    }

    public void setNamespace(String namespace) {
        this.namespace = namespace;
    }

    public void setMethod(String method) {
        this.method = method;
    }

    public void setScheme(String scheme) {
        this.scheme = scheme;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public void setPortletMode(String portletMode) {
        this.portletMode = portletMode;
    }

    public void setPortletUrlType(String portletUrlType) {
        this.portletUrlType = portletUrlType;
    }

    public void setWindowState(String windowState) {
        this.windowState = windowState;
    }

    public void setAnchor(String anchor) {
        this.anchor = anchor;
    }

    public void setForceAddSchemeHostAndPort(String forceAddSchemeHostAndPort) {
        this.forceAddSchemeHostAndPort = forceAddSchemeHostAndPort;
    }
}

权限模块__使用权限__拦截验证每个请求的权限

两个问题:拦截器怎么写,往里边写权限判断

CheckPrivilegeInterceptor.java

public class CheckPrivilegeInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("-------------之前");
        String result = invocation.invoke(); //放行
        System.out.println("-------------之后");
        return result;
    }
}

struts.xml

     <interceptors>
            <!-- 声明拦截器 -->
            <interceptor name="checkPrivilege" class="cn.itcast.oa.util.CheckPrivilegeInterceptor"></interceptor>

            <!-- 重新定义默认的拦截器栈 -->
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="checkPrivilege"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>

            </interceptor-stack>
        </interceptors>

另一种

说明拦截器可以用了,接着填充代码

struts.xml

        <!-- 全局的Result配置 -->
        <global-results>
            <result name="loginUI">/WEB-INF/jsp/userAction/loginUI.jsp</result>
            <result name="noPrivilegeError">/noPrivilegeError.jsp</result>
        </global-results>

错误页面noPrivilegeError.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<HTML>
<HEAD>
    <TITLE>没有权限</TITLE>
    <%@include file="/WEB-INF/jsp/public/commons.jspf" %>
</HEAD>
<BODY>

<DIV ID="Title_bar">
    <DIV ID="Title_bar_Head">
        <DIV ID="Title_Head"></DIV>
        <DIV ID="Title"><!--页面标题-->
            <IMG BORDER="0" WIDTH="13" HEIGHT="13" SRC="${pageContext.request.contextPath}/style/images/title_arrow.gif"/> 提示
        </DIV>
        <DIV ID="Title_End"></DIV>
    </DIV>
</DIV>

<!--显示表单内容-->
<DIV ID="MainArea">
        <DIV CLASS="ItemBlock_Title1">
        </DIV> 

        <DIV CLASS="ItemBlockBorder" STYLE="margin-left: 15px;">
            <DIV CLASS="ItemBlock" STYLE="text-align: center; font-size: 16px;">
                出错了,您没有权限访问此功能!
            </DIV>
        </DIV>

        <!-- 操作 -->
        <DIV ID="InputDetailBar">
            <A HREF="javascript:history.go(-1);"><IMG SRC="${pageContext.request.contextPath}/style/images/goBack.png"/></A>
        </DIV>
</DIV>

</BODY>
</HTML>

CheckPrivilegeInterceptor.java

public class CheckPrivilegeInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        /*System.out.println("-------------之前");
        String result = invocation.invoke(); //放行
        System.out.println("-------------之后");
        return result;*/

        //获取信息
        User user = (User) ActionContext.getContext().getSession().get("user");//当前的登录用户
        String namespace = invocation.getProxy().getNamespace();
        String actionName = invocation.getProxy().getActionName();

        String privUrl = namespace + actionName;//对应的权限url

        //如果未登录
        if(user == null) {
            if(privUrl.startsWith("/user_login")) {
                //如果是去登录,就放行
                return invocation.invoke();
            }else {
                //如果不是去登录,就转到登录页面
                return "loginUI";
            }

        }
        //如果已登录,就判断权限
        else{
            //如果有权限,就放行
            if(user.hasPrivilegeByUrl(privUrl)) {
                return invocation.invoke();
            }
            //如果没有权限,就转到提示页面
            else{
                return "noPrivilegeError";
            }
        }
    }
}

权限模块__使用权限__完善权限的分类

User.java

    /**
     * 判定本用户是否有指定url的权限
     * @param name
     * @return
     */
    public boolean hasPrivilegeByUrl(String privUrl) {
        //超级管理员有所有的权限
        if(ifAdmin()) {
            return true;
        }

        // >>去掉后面的参数
        int pos = privUrl.indexOf("?");
        if(pos > -1) {
            privUrl = privUrl.substring(0,pos);
        }

        // >>去掉UI后缀
        if(privUrl.endsWith("UI")) {
            privUrl = privUrl.substring(0, privUrl.length() - 2);
        }

        //如果本URL不需要控制,则登录用户就可以使用
        Collection<String> allPrivilegeUrls = (Collection<String>) ActionContext.getContext().getApplication().get("allPrivilegeUrls");
        if(!allPrivilegeUrls.contains(privUrl)) {
            return true;
        }else{
            //普通用户要判断是否含有这个权限
            for(Role role : roles) {
                for(Privilege priv : role.getPrivileges()) {
                    if(privUrl.equals(priv.getUrl())) {
                        return true;
                    }
                }
            }
            return false;
        }
    }

InitListener.java

     //准备数据:allPrivilegeUrls
        Collection<String> allPrivilegeUrls = privilegeService.getAllPrivilegeUrls();
        sce.getServletContext().setAttribute("allPrivilegeUrls", allPrivilegeUrls);
        System.out.println("-----------> 已准备数据 <-----------");

PrivilegeService.java

    //查询所有权限对应的URL集合(不重复)
    Collection<String> getAllPrivilegeUrls();

PrivilegeServiceImpl.java

  public Collection<String> getAllPrivilegeUrls() {
        return getSession().createQuery(
                "SELECT DISTINCT p.url FROM Privilege p WHERE p.url IS NOT NULL")
                .list();
    }

需要处理的一些细节

权限模块__解决小问题:重启Tomcat后还是登录状态

用户关联的角色权限部门都实现序列化接口

implements Serializable

权限模块__解决小问题:登录页面嵌套的问题

时间: 2024-08-04 21:08:50

权限模块_使用权限_显示有权限的链接_思路分析_拦截验证每个请求的权限_完善权限的分类_一些细节的相关文章

拦截验证每个请求的权限

Summer Holiday Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1430    Accepted Submission(s): 645 Problem Description To see a World in a Grain of Sand And a Heaven in a Wild Flower, Hold Inf

权限模块_使用权限_实现主页面的效果_显示左侧菜单&amp;只显示有权限的菜单项

权限模块__使用权限__实现主页面的效果 HomeAction.java public class HomeAction extends ActionSupport { public String index() { return "index"; } public String top() { return "top"; } public String bottom() { return "bottom"; } public String le

权限模块_分配权限_显示树状结构_页面中的选中效果

权限模块__分配权限__显示树状结构1 显示树状结构:依赖关系 setPrivilegeUI.jsp <!-- 显示权限树 --> <td> <!--用它回显 <s:checkboxlist name="privilegeIds" list="#privilegeList" listKey="id" listValue="name"></s:checkboxlist> --

权限模块_整体方案说明_设计实体&amp;映射实体_实现初始化权限数据的功能

权限模块_整体方案说明 要点说明 权限就是控制功能的使用(功能对应着URL). 对功能的控制就是对URL的访问控制. 在我们的程序中,一个功能对应一个或两个URL: 1,例如列表或删除功能,只对应一个URL. 2,例如添加或修改功能,对应两个URL:..add, ..addUI 权限模型 权限方案: 用户 *----* 角色 *----* 权限 与权限相关的功能具体有哪些: 初始化数据:... 分配权限:... 使用权限:... 具体有哪些功能 初始化数据(安装) 权限数据. 超级管理员. 分配

权限模块_分配权限_实现分配权限(登录与注销)的基本功能

权限模块_分配权限_实现分配权限的基本功能 选哪个就能存起来那个,能回显.有依赖关系 把一组相关功能放在一起 RoleAction.java /** * 设置权限页面 */ public String setPrivilegeUI() { //准备回显的数据 Role role = roleService.getById(model.getId()); ActionContext.getContext().getValueStack().push(role);//放到栈顶,从栈顶找对象 if(r

从零开始编写自己的C#框架(18)——Web层后端权限模块——菜单管理

从本章开始,主要讲解的是页面中对框架相关功能的调用方法,比如列表页面(又分为有层次感列表和普通列表).编辑页面.多标签页面等,只要熟悉了这些函数的使用方法,那么开发起来就会很便捷了. 1.如图先创建菜单列表与编辑页面 MenuInfoList.aspx 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MenuInfoList.aspx.cs" Inherits=&quo

从零开始编写自己的C#框架(19)——Web层后端权限模块

不知不觉本系统写了快三个月了,最近写页面的具体功能时感觉到有点吃力,很多地方如果张嘴来讲的话可以说得很细,很全面,可写成文字的话,就不太会写了,有些地方想讲得清晰的话,得用多几倍的文字+实例+变化中的图片才能表达得清楚,而写这些又太费时间了,近段时间又特忙,所以只能是尽力而为,希望大家自行研究,如果有什么地方不明白的,发发评论或邮件给我,我再重新详细讲解. 说回正题,对于页面访问权限以及每个按键的权限控制,很久以前用过好几种不同的方法,比如为每个控件分配名称或编码,然后在写代码时绑定这些值,又比

nopcommerce之权限模块

这篇文章简单介绍一下nopcommerce的权限模块,nopcommerce里面的权限设计相对比较简单,主要针对后台的action和前台的是否显示(比如产品.品牌等),虽然简单但是应付一般的项目应该没问题. 你只需要关注三张表: 1.AclRecord(访问控制表,比如控制某个产品某种角色前台是否可见) 2.PermissionRecord(权限表) 3.PermissionRecord_Role_Mapping(权限角色关联表) AclRecord: 后台添加编辑产品或者品牌的时候你一定会看到

jenkins权限管理,实现不同用户组显示对应视图views中不同的jobs

如何分组管理权限,如何实现不同用户组显示对应视图views中不同的jobs,建议使用Role Strategy Plugin插件. 1.安装Role Strategy Plugin插件. 2."系统管理"->"Configure Global Security"->策略授权选择"Role-Based Strategy". 3."系统管理"->"Manage and Assign Roles"