requirementauthorizer.java

来自「一个很好的开源项目管理系统源代码」· Java 代码 · 共 132 行

JAVA
132
字号
package net.java.workeffort.service.security;import java.util.HashMap;import java.util.Map;import net.java.workeffort.infrastructure.context.RequestContextHolder;import net.java.workeffort.infrastructure.security.AuthorizationException;import net.java.workeffort.infrastructure.security.ISecurityProfile;import net.java.workeffort.infrastructure.view.ViewHelper;import net.java.workeffort.service.BaseService;import org.aopalliance.intercept.MethodInvocation;import org.apache.commons.beanutils.PropertyUtils;import org.apache.commons.lang.StringUtils;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;/** * Fine grained authrorizer for requirement at a data level. * <p> * See configuration of 'requirementService' is file 'application-context.xml'. * @author Antony Joseph */public class RequirementAuthorizer implements IServiceAuthorizer {    protected static final Log logger = LogFactory            .getLog(RequirementAuthorizer.class);    /**     * A user can update a requirement record only if they are the owner.     * @param securityProfile The security profile     * @param invocation The method invocation.     */    public void preMethodInvocation(ISecurityProfile securityProfile,            MethodInvocation invocation) throws AuthorizationException {        int accessDecision = securityProfile.getAccessDecision(                getTarget(invocation), invocation.getMethod().getName());        if (accessDecision == ISecurityProfile.DENIED) {            throw new AuthorizationException("Authorization failed. partyCd="                    + securityProfile.getPartyCd() + " target="                    + getTarget(invocation) + " operation="                    + invocation.getMethod().getName());        }        else if (accessDecision == ISecurityProfile.CONDITIONAL) {            Object[] args = invocation.getArguments();            if (!isOwnerOfRequirement(securityProfile, invocation, args[0]))                throw new AuthorizationException(                        "Authorization failed. Not owner of requirement. partyCd="                                + securityProfile.getPartyCd() + " target="                                + getTarget(invocation) + " operation="                                + invocation.getMethod().getName());        }    }    /**     * When querying a requirement, set mode in request context. The 'mode' is     * used by view to display the form in update/viewonly modes etc.     * @param securityProfile The users security profile     * @param invocation The invocation method     * @param resultObject The result object of the method invocation. (See     *            <code>SecurityInterceptor</code>)     */    public void postMethodInvocation(ISecurityProfile securityProfile,            MethodInvocation invocation, Object resultObject)            throws AuthorizationException {        if ("getRequirement".equals(invocation.getMethod().getName())) {            String mode = null;            int accessDecision = securityProfile.getAccessDecision(                    "RequirementService", "updateRequirement");            if (accessDecision == ISecurityProfile.CONDITIONAL) {                String ownerCd = null;                try {                    ownerCd = (String) PropertyUtils.getSimpleProperty(                            resultObject, "ownerCd");                }                catch (Exception e) {                    throw new RuntimeException(e);                }                if (securityProfile.getPartyCd().equals(ownerCd))                    mode = ViewHelper.UPDATE_DELETE_MODE;                else                    mode = ViewHelper.VIEWONLY_MODE;            }            else if (accessDecision == ISecurityProfile.ALLOWED) {                mode = ViewHelper.UPDATE_DELETE_MODE;            }            else                mode = ViewHelper.VIEWONLY_MODE;            if (logger.isInfoEnabled())                logger.info("mode being set to " + mode                        + " in RequirementAuthorizer");            RequestContextHolder.getRequestContext().setMode(mode);        }    }    private boolean isOwnerOfRequirement(ISecurityProfile securityProfile,            MethodInvocation invocation, Object arg)            throws AuthorizationException {        Map map = new HashMap();        if (arg instanceof Long) {            map.put("requirementId", arg);        }        else {            // arg is of type Requirement            try {                map.put("requirementId", PropertyUtils.getSimpleProperty(arg,                        "requirementId"));            }            catch (Exception e) {                throw new RuntimeException(                        "Error getting property requirementId from arg:" + arg,                        e);            }        }        map.put("partyCd", securityProfile.getPartyCd());        BaseService service = (BaseService) invocation.getThis();        if (service.getDao().queryForObject("Requirement.getRequirementOwner",                map) == null)            return false;        else            return true;    }    private String getTarget(MethodInvocation invocation) {        return StringUtils.substringAfterLast(invocation.getThis().getClass()                .getName(), ".");    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?