shiro扩展知识

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/huyunqiang111/article/details/90033518

shiro如何设置sessioon时间

Shiro的Session接口有一个setTimeout()方法,登录后,可以用如下方式取得session

SecurityUtils.getSubject().getSession().setTimeout(1800000);

如果为负数代表永不超时

SecurityUtils.getSubject().getSession().setTimeout(-1000l); 

但是我们项目中扩展了shiro的存储结合redis来使用的我们在自定义的shiroSession中设置有效时间

可以设置session, 获取session, 删除session 

public class RedisSessionDao extends AbstractSessionDAO {
    // Session超时时间,单位为毫秒    之前是30分钟  现在改为24小时
    private long expireTime = 86400000;
    private static String prefix = "fs-shiro-session:";


    // Redis操作类
    @Autowired
    private RedisTemplate redisTemplate;

    public RedisSessionDao() {
        super();
    }

    public RedisSessionDao(long expireTime, RedisTemplate redisTemplate) {
        super();
        this.expireTime = expireTime;
        this.redisTemplate = redisTemplate;
    }

    @Override // 更新session
    public void update(Session session) throws UnknownSessionException {
        //System.out.println("更新session:"+session.getId().toString());
        if (session == null || session.getId() == null) {
            return;
        }
        session.setTimeout(expireTime);
        redisTemplate.opsForValue().set(prefix + session.getId(), session, expireTime, TimeUnit.MILLISECONDS);
    }

    @Override // 删除session
    public void delete(Session session) {
        //System.out.println("删除session:"+session.getId().toString());

        if (null == session) {
            return;
        }
        redisTemplate.opsForValue().getOperations().delete(prefix + session.getId());
    }

    @Override// 获取活跃的session
    public Collection<Session> getActiveSessions() {
        //System.out.println("获取活跃的session");
        Set<String> keys=redisTemplate.keys(prefix+"*");
        Collection<Session> list=new ArrayList<>();
        if (keys != null && keys.size() > 0) {

            for (String item : keys) {
                Session session=(Session) redisTemplate.opsForValue().get(item);
                list.add(session);


            }
        }
        return list;

    }

    @Override// 加入session
    protected Serializable doCreate(Session session) {

        Serializable sessionId = this.generateSessionId(session);
        this.assignSessionId(session, sessionId);
        //System.out.println("创建session:"+sessionId);
        redisTemplate.opsForValue().set(prefix + session.getId(), session, expireTime, TimeUnit.MILLISECONDS);
        return sessionId;
    }

    @Override// 读取session
    protected Session doReadSession(Serializable sessionId) {
        //System.out.println("读取session:"+sessionId.toString());

        if (sessionId == null) {
            return null;
        }
        return (Session) redisTemplate.opsForValue().get(prefix + sessionId.toString());
    }


    public void forceLogout(String sessionId) {

        redisTemplate.opsForValue().getOperations().delete(prefix +sessionId);
    }


    public long getExpireTime() {
        return expireTime;
    }

    public void setExpireTime(long expireTime) {
        this.expireTime = expireTime;
    }

    public RedisTemplate getRedisTemplate() {
        return redisTemplate;
    }

    public void setRedisTemplate(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
}

shiro是如何进行加密验证的

shiro缓存的使用

第一种:使用Redis做缓存,将数据存储到redis数据库中,自定义shrioCache扩展shiro的cache结合redis 将数据存放到redis中

A: 用户访问权限控制:
     1、判断用户是否分配了一定的安全角色。
     2、判断用户是否被授予完成某个操作的权限
B: 支持单点登录(SSO)功能
C:  提供了“身份认证”、“授权”、“加密”和“Session管理”这四个主要的核心功能
   授权 主体(Subject)对 资源(Resource)进行那些操作 (Permission)
D: 授权流程
    访问系统资源 --> 身份认证 --> 是否认证通过 --> 权限控制(分配权限是否拥有)
    --> 拥有继续访问(么有拒绝) 
E: 认证流程 
    访问系统的资源(菜单,连接,按钮,方法等)--> 是否允许匿名访问 --> 
    用户是否认通过?----> 输入用户名和密码进行用户认证通过---> 是否认证通过
    (通过继续访问 放回第一步) 不通过继续认证
    认证的主要代码
    创建SecurityManager工厂
    Factory<SecurityManager> factory 
     创建一个Subject实例,该实例认证要使用上边创建的securityManager进行
    Subject subject = SecurityUtils.getSubject();
     创建token令牌,记录用户认证的身份和凭证即账号和密码 
    UsernamePasswordToken
     用户登陆
    subject.login(token);

D: 角色用户权限关系
    用户 多多  角色  多多 权限 多一 资源(方法,菜单,按钮)

E: 基于URL 拦截
     实现思路是:将系统操作的每个url配置在权限表中,将权限对应到角色,将角色分
     配给用户,用户访问系统功能通过Filter进行过虑,过虑器获取到用户访问的url,
     只要访问的url是用户分配角色中的url则放行继续访问。
    
G: 自定义realm
    自定义的realm中 认证用户登录的用户名和密码
    具体的判断是在用户获取登录的用户名和密码之后UsernamePasswordToken 调用 
    subject 的主题认证在这个token 中获取用户名 和密码来验证用户名和密码
    
   
SecurityManager的中央/核心组件有关

//获取正在执行的当前用户
Subject currentUser = SecurityUtils.getSubject();

猜你喜欢

转载自blog.csdn.net/huyunqiang111/article/details/90033518
今日推荐