java - 权限框架shiro的的一个问题
高洛峰
高洛峰 2017-04-18 09:59:36
[Java讨论组]
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(4)
PHP中文网

1、首先给你个demo。

/**
 * Created by projack
 * 权限认证服务
 */
public class CmsShiroRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        //获取当前登录的用户名
        String name = (String) super.getAvailablePrincipal(principals);

        List<String> roles = new ArrayList<String>();
        List<String> permissions = new ArrayList<String>();
        User user = userService.findByName(name);
        if(user != null){
            for(Role role : user.getRoles()){
                roles.add(role.getName());
            }
            Set<Permission> pmssSet = userService.getPermissionsByUserId(user.getUserId());
            for(Permission pms : pmssSet){
                if(!StringUtils.isEmpty(pms.getPermission())){
                    permissions.add(pms.getPermission());
                }
            }
        }else{
            throw new AuthorizationException();
        }
        //给当前用户设置角色
        info.addRoles(roles);
        //给当前用户设置权限
        info.addStringPermissions(permissions);
        return info;
    }

    /**
     * 认证信息.(身份验证),登录时调用
     * @param token
     * @return
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //获取用户的输入的账号.
        String username = (String)token.getPrincipal();
        //通过username从数据库中查找 User对象,如果找到,没找到.
        //实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法
        User user = userService.findByName(username);
        if(user == null){
            return null;
        }
       /*
        * 获取权限信息:这里没有进行实现,
        * 请自行根据User,Role,Permission进行实现;
        * 获取之后可以在前端for循环显示所有链接;
        */
        //user.setPermissions(userService.findPermissions(user));

        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getName(),user.getPassWord(),user.getNickName());
        return authenticationInfo;
    }
}

2、Shiro根本就不用你的HttpSevletRequest和Response对象,Shiro自身维护了自己的Session,在Shrio的包下面。

PHP中文网

分享一个 Shiro 完整权限控制Demo

大家讲道理

楼主问题你已经定位到这里了。还在想着有机率会出现Bug?看你定位代码的程度已经非常深入了,这里就是简单的在request中拿个值。拿不到这显示是在Request中没有该值。这与shiro没有任何关系。

图 你看这张图,你定位到这里来了,为什么没有查看一下request中的参数呢?就是那个@10319对象。

伊谢尔伦

你截图里,能拿到的url是127.0.0.1,不能拿到的url是localhost,不知是不是和这个有关

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号