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();