Shiro安全框架09:springboot整合shiro实现动态授权(继上一篇)

目的:前端登录认证后可以进行相关的功能操作,具备访问权限的可访问,否则不可访问

第一步:前端代码

用于登录认证,这里就是上一篇的功能实现

<form action="/login" method="post">
    用户名:<input type="text" name="userName">
    密码:<input type="password" name="userPassword">
    <input type="submit" value="login">
</form>

点击相应的连接进入相应的模块,不过应该要具有相应的权限 

进入用户添加功能:<a href="/add">用户添加</a>
进入用户更新功能:<a href="/update">用户更新</a>

第二步:shiroconfig配置类

我在配置中添加了一个授权过滤器,

 //授权过滤器
        filterMap.put("/add","perms[user:add]");

 如上,这表示,对于这个连接请求,只有再具有user:add这个权限后才可以访问

@Configuration
public class ShiroConfig {

    /**
     * 创建shiroFilterFactoryBean
     */
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
        /**
         * shiro内置过滤器
         * anon:无需认证(登录)就可以访问
         * authc:必须认证才可以访问
         * user:如哦使用了rememberMe的功能可以直接访问
         * perms:该资源必须得到资源权限才可以访问
         * role:该资源必须得到相应的角色权限才可以访问
         */
        LinkedHashMap<String, String> filterMap = new LinkedHashMap<>();

        filterMap.put("/login","anon");
        filterMap.put("/login.html","anon");

        //授权过滤器
        filterMap.put("/add","perms[user:add]");


        filterMap.put("/*","authc");

        //使用通配的方式设置某一个目录的访问级别
       /* filterMap.put("/templates","authc");*/

        //设置访问被拦截过后的跳转页面
        shiroFilterFactoryBean.setLoginUrl("/myError");
        //设置未授权提示页面
        shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);

        return shiroFilterFactoryBean;
    }


    /**
     * 创建defaultWebSecurityManageer
     */
    @Bean(value = "defaultWebSecurityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //关联我们创建的realm
        securityManager.setRealm(userRealm);

        return securityManager;
    }


    /**
     * 创建realm
     */
    @Bean(value = "userRealm")
    public UserRealm getRealm(){
        return new UserRealm();
    }
}

第三步:自定义realm进行授权控制

public class UserRealm extends AuthorizingRealm {

    @Autowired
    UserService userService;

    /**
     * 认证
     * @param authenticationToken 令牌
     * @return 用户信息
     * @throws
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken;
        //从数据库中取出用户
        User user = userService.getUserByName(token.getUsername());
        System.out.println(user);
        //判断用户名是否存在
        if (user !=null){
            if (!token.getUsername().equals(user.getUserName())){
                //用户名不存在
                return null;
            }

            //判断密码
            return new SimpleAuthenticationInfo(user,user.getUserPassword(),"");
        }else {
            return null;
        }


    }

    /**
     * 授权
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        /*添加授权信息
        从数据库中查询并确认用户*/

        //获取主体,这个是当时认真的时候传过来的
        Subject subject = SecurityUtils.getSubject();
        //对主体进行类型转换
        User user = (User)subject.getPrincipal();
        //通过认证时候的用户名查询到相关用户,并从数据库中查询用户的所有数据
        User user1 = userService.getUserByName(user.getUserName());
        //将查询出来的用户所具有的权限用来对用户进行授权
        info.addStringPermission(user1.getUserPerms());

        return info;
    }
}

观察下面的授权模块,这里是从数据库中查询出用户所具有的权限,然后对用户进行授权

总结:到这里就已经完成了对用户的动态授权,对于/add这个请求,如果用户没有得到相应的权限就无法访问该地址

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值