微人事(3)- 动态权限控制(SpringCache、SpringSecurity)

前端设计:左侧菜单设计

将每一级的菜单放到数据库中,而不是写死到前端
enabled表示当前项是否启用。
keepAlive表示不显示这个标签的时候,这个标签是隐藏还是销毁。
requireAuth表示组件是否需要登录才能访问。

后台设计:动态权限控制

数据库:hr、hr_role、role、menu_role、menu
用户->角色->权限:在menu中定义了当前权限的url接口,例如员工奖惩对应的url为/personnel/ec/**
流程:用户发送http请求(hr),查看http请求中的url与menu表中字段的url匹配(menu),从而得到他要进行什么操作,查看当前的menu需要什么角色(menu_role),查看当前用户是否满足所需角色(hr_role).
步骤1
(1)查询初所有的menu和对应的role
(2)匹配请求url对应的menu,获取对应的role
(3)类型转换,将多个role返回
(4)否则返回登录角色

步骤2:
(1)查询当前用户的所有角色
(2)匹配当前用户角色是否包含所需角色

前端设计:左侧菜单设计中就不给一级菜单分配角色了,因为它没有实质性的接口,也更好的对角色划分。
代码实现
步骤1代码:这个类的作用,主要是根据用户传来的请求地址,分析出请求需要的角色
(menuService.getAllMenusWithRole()中查询初所有的menu以及对应的role,因为经常用到将其缓存到redis中,使用@Cacheable)

@Component
public class CustomFilterInvocationSecurityMetadataSource implements 
FilterInvocationSecurityMetadataSource{
@Autowired
    MenuService menuService;
    AntPathMatcher antPathMatcher = new AntPathMatcher();
    @Override
    public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
        String requestUrl = ((FilterInvocation) object).getRequestUrl();//获取当前数据库的地址,从而与去menu中查询
        List<Menu> menus = menuService.getAllMenusWithRole();//查询所有的menu和对应的role
        for (Menu menu : menus) {
            if (antPathMatcher.match(menu.getUrl(), requestUrl)) {//查询当前的请求url和哪一个menu匹配
                List<Role> roles = menu.getRoles();//获取这个menu对应的所有角色role
                String[] str = new String[roles.size()];
                for (int i = 0; i < roles.size(); i++) {
                    str[i] = roles.get(i).getName();
                }
                return SecurityConfig.createList(str);//类型转换,将roles转换成Collection<ConfigAttribute>并返回
            }
        }
        return SecurityConfig.createList("ROLE_LOGIN");
    }

步骤2代码:判断当前用户角色时候包含所需角色

@Component
public class CustomUrlDecisionManager implements AccessDecisionManager {
    @Override
    public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {
        for (ConfigAttribute configAttribute : configAttributes) {
            String needRole = configAttribute.getAttribute();//获取所需角色
            if ("ROLE_LOGIN".equals(needRole)) {//登录角色,则要求登录
                if (authentication instanceof AnonymousAuthenticationToken) {//判断auth实例时匿名实例,则抛出异常
                    throw new AccessDeniedException("尚未登录,请登录!");
                }else {
                    return;
                }
            }
            Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();//获取当前用户的角色
            for (GrantedAuthority authority : authorities) {//遍历当前用户角色是否包含所需角色
                if (authority.getAuthority().equals(needRole)) {
                    return;
                }
            }
        }
        throw new AccessDeniedException("权限不足,请联系管理员!");
    }

步骤3代码:将上面两个类引入总的security配置文件中

public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    HrService hrService;
    @Autowired
    CustomFilterInvocationSecurityMetadataSource customFilterInvocationSecurityMetadataSource;
    @Autowired
    CustomUrlDecisionManager customUrlDecisionManager;
@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
                    @Override
                    public <O extends FilterSecurityInterceptor> O postProcess(O object) {
                        object.setAccessDecisionManager(customUrlDecisionManager);
                        object.setSecurityMetadataSource(customFilterInvocationSecurityMetadataSource);
                        return object;
                    }
                })

动态权限控制扩展知识1:

现在的权限和url绑死的,如果想展示menu,不给权限,或者给权限,不展示menu,一个解决方式,是不将menu和url写死,将menu在前端写死(不从数据库中读取),给每一个menu定义一个meta属性:

meta:{
    roles:['admin','user']
}

发送请求的时候,将meta添加到请求中。

动态权限控制扩展知识2:
认证失败的时候,想要重定向还是返回错误信息。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经中国企业家联合会调查,动态人事管理系统更专注于人性化地用户体验约85%的企业没有完善的人事管理系统,即便有系统,80%的系统也都是伪系统,不能产生经济效益与持续发展。 人才做为企业发展的最根本因素,已经为业内人士广泛认知!人才的竞争已经成为企业核心价值竞争中最为关键的一环,而拥有完善的人事管理系统,能在激烈的人才竞争中,赢得先机,完美的完成企业人才从招聘、培训、发展的全过程无缝对接,避免了企业无谓的人才流失。喜杰龙智能人事管理系统,能帮您的企业轻松解决这一切问题。 http://www.hrms.grxxzx.com/动态人事管理系统现在注册终身免费使用 动态人事管理系统对企业的三大功能 1:有效遏制员工恶意跳槽行为 2:有效提高员工素质 3:有效规避企业用工风险 动态人事管理系统对员工的三大功能 1:员工应聘时不需要带任何个人资料 2:提高自身素质及应聘成功率 3:企业对员工的记录随时查看 什么是动态人事管理系统? 动态人员管理系统是一种集人事信息储存及管理的一种产品。有效帮助企业了解员工全方位的信息以及工作上的成绩,不仅提高了员工工作的积极性,在遇到一些问题纠纷的时候,也可以使企业遭受的经济损失降到最低,有效保证企业的利益。在当前企业人事流动比较大的现状下,好的人事管理显得尤为重要。 (案例一)某食品添加剂公司业务员李某,在职2年,有一天,公司负责人徐某收到一张其在室外工作时间留下的欠条,上面写道:“因家中有急事用钱,等有钱时还上”,徐某很着急,当下便报了案。派出所以“所里多件案情严重的刑事案件急待处理,而且此案件涉及损失金额(8000元)较少,办案经费有限”为由拒绝受理该案件。徐某又急又生气,却也无可奈何。 (案例二)某物流中心刚上岗三个月的财务人员何某,在没有任何前兆的情况下长时间擅离工作岗位,通过各种渠道都联系不上本人,造成该物流中心的账目一片混乱。企业负责人才意识到,对何某信息没有过多的了解,此时想挽回残局,却无从下手。 由于大多数企业对人事管理不规范,诸如此类的案件时有发生,大大影响了企业的效益。 (案例三)因公出差的肖某入住某酒店,服务生王某在客房服务时,发现房间里肖某的现金,一时贪念,趁肖某不注意,偷偷拿了一部分(合计人民币3000元),客人发现,当下打电话报了案。事发后,王某因害怕跑回了老家。酒店负责人当机决断,付诸于人力,物力,财力,去王某老家帮忙追回了肖某被盗的钱财。这件事情虽然解决了,但是对该酒店的信誉造成了无可挽回的损失,而且给酒店带来了不必要的经济损失,得不偿失。 (目标明确)随着动态人事管理系统在市场上的推行,该系统被诸多公司所采纳,而且都给予了好评。 抱着一种尝试的态度,酒店负责人决定使用动态人事管理系统,在不到三个月的时间,就发现了前台收银员小赵贪污现款。于是,酒店做出处罚,在下个月扣除其贪污的钱。抱着一种侥幸心理,小赵坚决不承认,也不服从酒店的处罚管理,扬言辞职。小赵在此之前也知道酒店使用了动态人事管理系统,但是并不了解它的作用。酒店负责人解释说,这个动态人事管理系统,不仅记录着每个员工的信息,还有每个员工在职期间的表现,就是一个数据库,管理着每个员工的从业档案。如果表现突出,成绩优异,这些数据会在你以后的发展平台上祝你一臂之力,如果,表现拙劣,那么这个污点也将伴随你走完一生。但是,我们酒店实行人性化管理,给你一次机会,如果你能认识到自己的错误,改正错误并努力工作,我们将考虑删除此项不良记录,重新客观的考量你。听了负责人的一席话,在事实面前,她惭愧不已。,小赵思量片刻,决定留在酒店继续工作,不仅要通过自己的努力删除那个不良记录,而且还要做一名优秀员工,在自己的数据库里写上光彩的一笔。事实证明,她做到了。那年年底,她被评为“年度酒店优秀员工” (结束语)在市场的磨练中,动态人员管理系统,一起见证了企业和员工的共同成长,使企业人事管理朝规范化、高效化发展。 www.hrms.grxxzx.com/动态人事管理系统现在注册终身免费使用[/url] 咨询电话:4006131473(一生一世起山)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值