NutzCN Logo
问答 nutz.cn源码里面 如果登陆时加上了rememberMe 是在哪里实现的?
发布于 3276天前 作者 frenzy917 3152 次浏览 复制 上一个帖子 下一个帖子
标签: shiro mvc

在nutz.cn 中 ,登陆时加上了rememberMe

在shiro中是在什么地方实现的存储cookies, 在下次登陆时如何将 me 放到session中

另外如何更改
subject.getSession().setAttribute(NutShiro.SessionKey, subject.getPrincipal());
中的subject.getPrincipal() 的值

16 回复
  1. 那是shiro的事,没研究过, 貌似就是走cookie
  2. subject.getPrincipal()的值, 取决于Realm实现的doGetAuthenticationInfo方法, 返回的SimpleAccount的构造方法的第一个参数就是它

@wendal 那如果添加了cookie ,在后面登陆时怎么取得用户信息?

需要设置 token的rememberMe=true

@Rekoe 我再页面上加了选项,再次登陆时@RequiresUser 这里可以过,识别出来了
但是session里面是空的

你后端需要设置这个属性

rememberMe 是true 么

public class CaptchaUsernamePasswordToken extends UsernamePasswordToken {

	private static final long serialVersionUID = 4676958151524148623L;
	
	private String captcha;

	public String getCaptcha() {
		return captcha;
	}

	public void setCaptcha(String captcha) {
		this.captcha = captcha;
	}

	public CaptchaUsernamePasswordToken(String username, String password, boolean rememberMe, String host, String captcha) {
		super(username, password, rememberMe, host);
		this.captcha = captcha;
	}
}

@Rekoe 我跟到这个类了,提交时rememberMe 就是true ,cookie 也写入了 key就是rememberMe

但是重启tomcat后能够进入@RequiresUser 标记的方法,session me是空的

那是因为不会再调用subject.getSession().setAttribute 吧

这个好像需要前端自己用js 处理吧

我在想是不是让ShiroSessionProvider检查一下这个值

你在这个位置控制session加载?

不然这集成总是缺了点什么

好像不好搞

我这样改了一下,不知道合理不合理,麻烦帮忙看下吧
目前测试是可以生效的

shiro.ini

authc = org.nutz.integration.shiro.CaptchaFormAuthenticationFilter
authc.loginUrl  = /user/login
logout.redirectUrl= /user/login

[urls]
/rs/*        = anon
/user/logout = logout
/user/error  = anon
/user/profile/active/mail = anon
/**     = authc

然后在 CaptchaFormAuthenticationFilter 中

 @Override
	  protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
	  Subject subject = getSubject(request, response);
	  if(!subject.isAuthenticated() && subject.isRemembered()){
	    Session session = subject.getSession(true);
	    if(session.getAttribute(NutShiro.SessionKey) == null){
	    subject.getSession().setAttribute(NutShiro.SessionKey, (Long)subject.getPrincipal());
	    }
	  }
	  return subject.isAuthenticated() || subject.isRemembered();
	    }

还要加上 ,要不验证码显示不了..其他不需要登陆的方法类似
[urls]
/rs/* = anon
/user/logout = logout
/user/error = anon
/user/profile/active/mail = anon
/captcha/* = anon
/** = authc

原来你是要找个效果

其实 你可以用 ShiroSessionProvider 中加这个处理
这样所有的地方都会处理到

添加回复
请先登陆
回到顶部