Shiro请求授权实现

Shiro请求授权实现

请求授权的关键方法是realm下面的doGetAuthorizationInfo,每次我们需要授权时候都需要经过这一个方法。我们也需要在
ShiroFilterFactoryBean下面设置好进入什么链接需要什么样的权限filterChainDefinitionMap.put("/add",“perms[user:add]”);在授权我们需要用到一些pricipal,而这些pricipal通常会存储在subject上面,我们可以通过SecurityUtils,来获得subject,原因是SecurityUtils里面是有SecurityManager用户管理器,我们可以通过用户管理器获取用户并且进行对用户所有拥有的权限进行检验。

代码(UserReaml)

public class UserRealm extends AuthorizingRealm {
    @Autowired
    UserService service;

    //横切的认证和授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("我是授权");

        Subject subject = SecurityUtils.getSubject();

        User principal = (User) subject.getPrincipal();

        SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
//        给user授权
        info.addStringPermission(principal.getPerms());


        return info;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("我是认证");

        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;

        User userByName = service.getUserByName(token.getUsername());
        if(userByName==null){
            return null;
        }

        Object pricipal=userByName;



//            这里的pricipal会共享到授权方法,而且能够通过SecurityUtils来获取subject
        return new SimpleAuthenticationInfo(pricipal,userByName.getPwd(),"");
    }
}

代码(ShiroConfig)

@Configuration
public class ShiroConfig {

    //需要bean用户

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
        ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
        bean.setSecurityManager(securityManager);

//        设置内置的过滤器,拦截
        Map<String, String> filterChainDefinitionMap=new HashMap<>();
        /*
        authc认证后才能登录
        anno无需认证
        user:必须拥有记住我的功能才能使用
        perms:拥有某个资源的权限才能访问
        role:拥有某个角色才能访问
         */
//        这里使用了aop,给过滤器加上拦截这几个请求,需要经过认证,通过cookie来确定是否认证成功
        filterChainDefinitionMap.put("/add","authc");
        filterChainDefinitionMap.put("/update","authc");
//        可以访问add需要的权限
        filterChainDefinitionMap.put("/add","perms[user:add]");
        filterChainDefinitionMap.put("/update","perms[user:update]");

        bean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        bean.setLoginUrl("/toLogin");

        bean.setUnauthorizedUrl("/anno");
        return bean;
    }
    //需要用户管理

    @Bean(name="securityManager")
    public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm);
        return securityManager;
    }
    //需要数据连接

    @Bean(name="userRealm")
    public UserRealm userRealm(){
        return new UserRealm();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值