Shiro的 rememberMe 功能使用指导为什么rememberMe设置了没作用
1、打开IE选工具/Internet选项/内容/自动完成/自动完成功能应用于下面有四个选项,如果没有勾选,请勾选,按确定应用即可。
2、如果故障依旧,运行输入gpedit.msc回车打开组策略,在左侧选用户配置/管理模板/Windows组件/Internet Explorer/在右侧选“禁用表单的自动完成功能”和“禁止自动完成功能保存密码”双击它,在打开的对话框中选择“未配置”然后按应用确定,重启电脑即可。
3、也可以,修改注册表启动“自动完成”功能
开始/运行输入regedit回车打开注册表编辑器,依次单击展开[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer]子健,在其下新建一个名为“Autocomplete”的子健,然后在右窗口新建一个名为的“Append Completion”的“字符串值”键值项,将其数值设置为“YES”即可(注:上面新建的键值如果已存在就不需要重建,按照上述方法进行修改就是了)。
shiro-core-1.2.3.jar 干什么用的
在MBG中,最主要也最重要的就是XML配置文件,因此本篇文章主要的内容就是XML配置。 这里按照配置的顺序对配置逐个讲解,更细的内容可以配合中文文档参照。 1. 配置文件头 使用最新版的MBG需要使用上面的xml头,配置文件必须包含上面的DOCTYPE。 ...
shiro记住我cookie无法添加 按照网上的说法 把配置文件中所有的配置都写了 javabea
ie11下查看cookie:1:IE11=》F12打开开发人员工具2:开发人员工具=》网络F5启用网络流量捕获3:IE11=》输入和访问相关网址4:开发人员工具=》网络=》详细信息=》Cookie如果你只在java后台写的cookie,前端浏览器当然看不到
怎么获取shiro中的session对象
1、Shiro默认的Session处理方式
!-- 定义 Shiro 主要业务对象 --
bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"
!-- property name="sessionManager" ref="sessionManager" / --
property name="realm" ref="systemAuthorizingRealm" /
property name="cacheManager" ref="shiroCacheManager" /
/bean
这里从DefaultWebSecurityManager这里看起,这个代码是定义的Shiro安全管理对象,看下面的构造方法(代码 1-1)
(代码 1-1)
public DefaultWebSecurityManager() {
super();
((DefaultSubjectDAO) this.subjectDAO).setSessionStorageEvaluator(new DefaultWebSessionStorageEvaluator());
this.sessionMode = HTTP_SESSION_MODE;
setSubjectFactory(new DefaultWebSubjectFactory());
setRememberMeManager(new CookieRememberMeManager());
setSessionManager(new ServletContainerSessionManager());
}
从 构造方法里面可以看出,这里面有 publicvoid setRememberMeManager(RememberMeManager rememberMeManager) 和 publicvoid setSessionManager(SessionManager sessionManager)两个方法。这两个分别是对Shiro的remembereMe功能和Session功能的管理。其中在构造方法里面可以看到,其实一开是就设置了SessionManager,就是默认的:ServletContainerSessionManager().接下来看看默认的ServletContainerSessionManager()是怎么玩转Session的.看下图。这个图显示了这个类的这些个方法
这个类通过getSession(SessionKey)获得Sesison,下面看看这个方法干了些什么(代码1-2)
(代码1-2)
publicSession getSession(SessionKey key) throws SessionException {
if (!WebUtils.isHttp(key)) { //判断是不是http的key,否则抛异常
String msg = "SessionKey must be an HTTP compatible implementation.";
throw new IllegalArgumentException(msg);
}
HttpServletRequest request = WebUtils.getHttpRequest(key); //通过工具类获得HttpServletRequest 这类是javax.servlet.http.HttpServletRequest;
Session session = null;
HttpSession httpSession = request.getSession(false);//先从request里获得本来存在的
if (httpSession != null) {
session = createSession(httpSession, request.getRemoteHost());//如果不为空,就创建一个封装了的,为空就不管它
}
return session;
}
可以看看注释,注释上都写好了,这里的意思是,首先判断封装好的Key是不是Http的key,如果是就继续,不是就抛异常.key这个是带了ServletRequest和ServletResponse的WebSessinKey,具体怎么new出来的,看DefaultWebSecurityManager的这方法代码就知道了(代码1-3),这里里,将Request和Response还有sessionId传递进去
(代码1-3)
@Override
protected SessionKey getSessionKey(SubjectContext context) {
if (WebUtils.isWeb(context)) {
Serializable sessionId = context.getSessionId();
ServletRequest request = WebUtils.getRequest(context);
ServletResponse response = WebUtils.getResponse(context);
return new WebSessionKey(sessionId, request, response);
} else {
return super.getSessionKey(context);
}
}
因为继承了 org.apache.shiro.session.mgt.DefaultSessionKey ,这个类是实现了SessionKey这个接口。
看看createSession这个方法,这个方法就是将传入的HttpSession和host传进去,封装成Shiro的HttpServletSession (代码 1-4)
(代码1-4)
protectedSession createSession(HttpSession httpSession, String host) {
return new HttpServletSession(httpSession, host);
}
关于默认的Session管理器,最后还看一下HttpServletSession这个类,就看一下的几个方法,还有些方法是没有放出来的,可以明显的看出,Shiro使用了一个叫Session的接口,但这个接口是和HttpSession的接口一模一样,就是通过HttpSession这个接口获得Session的功能(代码1-5)
(代码1-5)
public class HttpServletSession implements Session {
private HttpSession httpSession = null;
public HttpServletSession(HttpSession httpSession, String host) {
if (httpSession == null) {
String msg = "HttpSession constructor argument cannot be null.";
throw new IllegalArgumentException(msg);
}
if (httpSession instanceof ShiroHttpSession) {
String msg = "HttpSession constructor argument cannot be an instance of ShiroHttpSession. This " +
"is enforced to prevent circular dependencies and infinite loops.";
throw new IllegalArgumentException(msg);
}
this.httpSession = httpSession;
if (StringUtils.hasText(host)) {
setHost(host);
}
}
……………………
……………………
………………
public Object getAttribute(Object key) throws InvalidSessionException {
try {
return httpSession.getAttribute(assertString(key));
} catch (Exception e) {
throw new InvalidSessionException(e);
}
}
public void setAttribute(Object key, Object value) throws InvalidSessionException {
try {
httpSession.setAttribute(assertString(key), value);
} catch (Exception e) {
throw new InvalidSessionException(e);
}
}
………………
………………
}
默认的模式就描述到这里
弱弱的问下,shiro可以实现各种终端的身份验证吗
大部分的智能手机系统安装和运行一个应用软件,都需要证书的签名认证。未经任何签名的程序是不能在智能手机上安装和运行的。有的终端虽然能够安装和运行没有签名的应用程序,但是特殊api或敏感api却被限制使用,或者老是弹出气人的警告对话框。第三方应用程序的签名认证是智能手机操作系统或软件平台的安全策略。即要求各种运行的第三方应用程序和软件都需要数字签名。其核心部分包括开发者以及开发者完成的终端应用,通过对终端应用产生、发布、使用的完整生命周期建立认证和控制体系,形成点对点的安全控制,在为终端应用用户提供安全的终端应用之外,也为安全问题的责任追溯和版权的保护提供有效的证据支持。软件开发者将生成私钥 (.pvk) 和证书请求文件 (CSR) 提交给证书颁发机构(CA) ,同时提交有关身份证明文件 ( 如:营业执照和第三方证明文件等 ) 给 CA 鉴证, CA 在验证身份后用自己的私钥给 CSR 文件签名后就生成代码签名证书,也就是公钥 (.spc 或 .cer) 文件给软件开发商,这样就完成了证书的申请和颁发过程。软件开发者用代码签名工具 ( 如: signSIS) 给要签名的代码生成一个 Hash 表,再用其私钥加密 Hash 表产生认证摘要,接着就把认证摘要连同其公钥与软件代码一起打包生成签名后的新的软件代码。最终用户安装或运行签名的应用软件时,手机智能操作系统会从签名代码中解读出其签名证书 ( 公钥 ) 和 Hash 表摘要,并与Windows 操作系统或 Symbian 移动操作系统中的受信任的根证书相比较查验公钥证书的有效性和合法性,验证签名证书正确后,就可以确认此代码确实是来自真实的软件开发商。接着,再使用签名时使用的同样算法对软件代码生成一个 Hash 表,并使用公钥也同样生成一个 Hash 表认证摘要,比较从代码中解包出来的 Hash 表认证摘要与生成的 Hash 表认证摘要是否一致,如果一致,则表明此代码在传输过程中没有被篡改,从而可以确认代码的完整性。由此,我们可以看出签名认证实际上分为两块:数字签名和验证签名数字签名的基本过程是:签名工具对原始数据进行杂凑运算得到消息摘要,再使用签名私钥对消息摘要进行加密运算。验证签名的基本过程则:智能手机操作系统或软件平台对收到的原始数据采用相同的杂凑运算得到消息摘要,将与被签署时候的消息摘要进行对比,以校验原始数据是否被篡改。所以,通过数字签名技术可以实现对数据完整性、以及传送数据行为不可否认性的保护。应用系统签名认证所需要的证书来源有三种模式:第一种是自签名证书。这种方式以android为代表;android中的签名仅仅是让用户知道该应用的开发者,但没有验证开发者的身份第二种OEM或移动运营商来颁发,这种方式以apple,rim为代表;这种方式安全是得到了保障,但对开发者来说是极其不爽第三种是通过第三方商业性是权威的数字证书机构签名认证,比较著名的CA有:Verisign,Thawte。这种模式以windows mobile为代表下面具体介绍一下各个手机操作系统或平台的数字签名运行机制或要点。1、Android数字签名Android数字包含以下几个要点:(1)所有的应用程序都必须有数字证书,Android 系统不会安装一个没有数字证书的应用程序(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证(3)如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。(5)Android使用标准的java工具 Keytool and Jarsigner 来生成数字证书,并给应用程序包签名。android数字签名的作用仅仅是1)识别代码的作者2)检测应用程序是否发生了改变3)在应用程序之间建立信任,基于这一信任关系,应用程序可以安全地共享代码和数据。2、windows mobile数字签名windows mobile数字签名有以下3种策略:(1)只准许运行签过名的程序;(2)准许运行所有程序(包括未签名), 但是使用特权api的程序不能正常运行;(3)包括使用了特权api的程序(不管有无签名)都可以运行.一般用户选择的安全策略是第二种, 这样既在一定程度上保护了设备又能运行大部分的应用程序(一般网络上免费的那些应用程序都是没有签名的). 如果程序中使用了特权api, 如果不签名(而且要签特权的)的话那大部分用户都使用不了3、Iphone数字签名Iphone中的签名限制度是比较高的所有iPhone 应用程序在iPhone OS设备上运行之前必须用合法的 signing identity 进行签名iphone开发签名标识的获取:1)使用Keychain Access utility里边的Certificate Assistant来创建一个签名许可请求Certificate Signing Request (CSR)2)提交这个请求,得到使用iphone开发者计划的计划入口的正式许可证书文件。3)安装证书文件开发者提交应用程序给苹果审批和部署的时候,苹果会做如下工作:1)苹果验证该程序代码是否来自有效的已注册的开发者。2)苹果用自己的签名证书为你的已签名的应用程序签名。这样,第三方应用程序才能够在iPhone ,iPod Touch上正常的运行。当你安装了已签名的应用程序到你的iphone上去的时候,iphone OS 将要验证签名以确保该应用程序已签名并在签名以后未被篡改。如果签名无效或者你根本就没有签名,iphone OS 将不允许该应用程序运行。签名之后,所有的应用文件、MIF中的权限,开发者也将不得再擅自改动了。4、blackberry数字签名出于安全和出口控制的原因,Research In Motion (RIM)必须跟踪一些敏感BlackBerry应用程序编程接口(API)的使用情况。敏感类别或方法在API参考文档中使用“锁定”图标或 “Signed”字样表示。如果应用程序使用了这些受控类,应用程序.cod文件加载到BlackBerry智能手机之前,应用程序必须使用签名工具(由 RIM提供)进行签名。1)每次需要给cod文件签名的时候,机器需要连入Internet在线签名2)签名工具将发送一个代码文件的SHA-1哈希到签名中心, 系统可以生成一个需要的签名.3)加载一个签名.cod文件到BlackBerry设备时,VM将此.cod文件域API库连接,并且检验.cod文件是否需要签名.如果没有签名,VM停止连接,并且不再加载应用程序.5、BREW数字签名BREW中的签名限制度是极其高的,不支持普通CA颁发的证书的签名,更不要说随意的自签名了。 BREW中的签名,只认高通的根证书进行的签名。 也就是说,只有高通授权的应用,才能在手机中运行。一般情况下,一个CP厂商的BREW应用想上线,必须经过天翼博路的详细测试,应用最终通过测试后,高通就会对整个应用包(包括应用的可执行文件mod,应用的模块信息文件mif,以及所有其他的应用文件)进行签名,然后返回CP厂商进行上线。签名之后,所有的应用文件、MIF中的权限,开发者也将不得再擅自改动了。6、j2me数字签名MIDP 2.0 比 MIDP 1.0 增强了安全策略,把 API 分为普通 API 和敏感 API 。MIDlet 2.0 推出了可信任 MIDlet(trusted) 和不可信任 MIDlet(untrusted) 的概念,一个不可信任 MIDlet 只能访问有限的 API ,同时还需要用户手动确认并修改其安全策略;而可信任 MIDlet 则自动继承系统中的安全策略而获得访问许可。j2me数字签名签名要点:(1)基于 MIDlet 的安全策略,某些功能是必须签名才能使用的,而有些功能虽然不签名也可以使用,但必须要求用户在使用时确认和修改其安全策略,如:写用户数据缺省是不允许没有签名的 MIDlet 操作的;(2)基于手机的系统安全和移动网络的安全考虑,某些手机制造商、移动运营商等可能拒绝没有签名的 MIDlet 在手机上安装和运行;(3)大大改善用户体验,让用户使用方便,使得用户不会遭遇调用受保护 API 时的安全警告的烦恼;(4)出于安全考虑,安装没有签名的 MIDlet 是会有安全警告的,而相反,安装已经签名的 MIDlet 则不会出现烦人的警告,手机会自动验证签名而顺利地安装成功;(5)已经签名的 MIDlet 将使得用户能改善其低安全策略设置,提高手机的安全性;(6)确保已经签名的 MIDlet 不会被非法篡改和非法盗用。7、S60数字签名S60第三版对在系统中安装运行的第三方软件有更为严格的规定。某些涉及手机软硬件安全于与个人信息安全等方面的操作被做了特别的限制(比如随手机开机自动启动就是被限制的功能之一)。应用程序要实现这些"被特别限制"了的功能就必须获得“签名”。未经任何签名的程序不能安装运行。签名又大致分2种:1)Symbian 签名。即 Symbian(塞班)手机操作系统官方签名。通过了 Symbian 安全认证的软件才会获得 Symbian 的签名。该类软件有最高的安全级别。在手机上能正常安装/运行/且能实现软件提供的所有功能.2)开发者签名。软件开发者在发布软件的时候就对软件进行了签名。这类软件可以在手机上安装运行(可能会遇到安全性警告,可跳过)。但不能实现那“被特别限制”了的功能。如果某软件根本不涉及这类功能,那么软件作者也完全可能自己签名就行了。还有一种可能就是软件虽然有某部分功能属于“被特别限制”的范围