我使用Shiro注释来检查这样的授权:
@RequiresPermissions("addresses:list")
public ModelAndView getCarrierListPage() {
return new ModelAndView("addressList", "viewData", viewData);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果用户没有注释所需的权限,则抛出异常.如果发生异常,我宁愿将用户重定向到其他URL.我怎么做?
这是我的shiro过滤器配置:
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="loginUrl" value="/showLoginPage"/>
<property name="filterChainDefinitions">
</property>
</bean>
Run Code Online (Sandbox Code Playgroud) 我在申请认证时使用shiro.我使用散列密码和盐,我将它们存储在我的数据库中,如下所示:
private User createUserWithHashedPassword(String inName, String inFirstName, String inLastName, String inPassword){
ByteSource salt = randomNumberGenerator.nextBytes(32);
byte[] byteTabSalt = salt.getBytes();
String strSalt = byteArrayToHexString(byteTabSalt);
String hashedPasswordBase64 = new Sha256Hash(inPassword, salt, 1024).toBase64();
return new User(inName,inFirstName,inLastName,hashedPasswordBase64,strSalt);
}
Run Code Online (Sandbox Code Playgroud)
我在我的数据库中使用String存储salt.现在在我的领域我想从数据库中获取我的数据,我使用了一个transactionnal服务.但是我的salt是一个Strong,所以我希望它以静态方法转回ByteSource类型:
ByteSource byteSourceSalt = Util.bytes(salt); //where the salt is a String
Run Code Online (Sandbox Code Playgroud)
但是当我创建我的SaltedAuthenticationInfo时,它不会授权.
我认为我的问题来自我的转换方法:
private String byteArrayToHexString(byte[] bArray){
StringBuffer buffer = new StringBuffer();
for(byte b : bArray) {
buffer.append(Integer.toHexString(b));
buffer.append(" ");
}
return buffer.toString().toUpperCase();
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
我的独立应用程序使用Shiro进行安全管理.我遇到了过期会话的问题.如果用户会话过期,当我尝试将用户重新登录时,我会收到以下异常.有人可以帮忙吗?
org.apache.shiro.session.UnknownSessionException: There is no session with id [d32af383-5f26-463f-a2f0-58a0e82c7890] at org.apache.shiro.session.mgt.eis.AbstractSessionDAO.readSession(AbstractSessionDAO.java:170) at org.apache.shiro.session.mgt.DefaultSessionManager.retrieveSessionFromDataSource(DefaultSessionManager.java:236) at org.apache.shiro.session.mgt.DefaultSessionManager.retrieveSession(DefaultSessionManager.java:222) at org.apache.shiro.session.mgt.AbstractValidatingSessionManager.doGetSession(AbstractValidatingSessionManager.java:118) at org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupSession(AbstractNativeSessionManager.java:105) at org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupRequiredSession(AbstractNativeSessionManager.java:109) at org.apache.shiro.session.mgt.AbstractNativeSessionManager.stop(AbstractNativeSessionManager.java:238) at org.apache.shiro.session.mgt.DelegatingSession.stop(DelegatingSession.java:127) at org.apache.shiro.session.ProxiedSession.stop(ProxiedSession.java:107) at org.apache.shiro.subject.support.DelegatingSubject$StoppingAwareProxiedSession.stop(DelegatingSubject.java:419) at org.apache.shiro.session.ProxiedSession.stop(ProxiedSession.java:107) at org.apache.shiro.subject.support.DelegatingSubject$StoppingAwareProxiedSession.stop(DelegatingSubject.java:419)
我用spring配置shiro
<bean id="securityManager" class="org.apache.shiro.mgt.DefaultSecurityManager">
<property name="realm" ref="myRealm"/>
<property name="sessionManager.globalSessionTimeout" value="3600000" />
</bean>
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/>
<property name="arguments" ref="securityManager"/>
</bean>
Run Code Online (Sandbox Code Playgroud) 如何在使用Apache shiro时设置cacheManager属性.在调试时,我得到了INFO,
80104 [1045903843@qtp-967078155-3] INFO org.apache.shiro.realm.AuthorizingRealm - No cache or cacheManager properties have been set. Authorization cache cannot be obtained.
Run Code Online (Sandbox Code Playgroud)
我使用的是JSF2和Google Cloud SQL.
我发现了一个灵活的安全框架Apache Shiro.我使用Shiro成功实现了身份验证和授权.
该框架的一个吸引人的特性是基于实例的安全性.我刚从Shiro网站上复制了一些例子.
以下权限存储在数据库中.
printer:query:lp7200
printer:print:epsoncolor
Run Code Online (Sandbox Code Playgroud)
以下代码检查对于给定的打印机实例,当前经过身份验证的用户是否具有权限.
if ( SecurityUtils.getSubject().isPermitted("printer:query:lp7200") {
// Return the current jobs on printer lp7200
}
Run Code Online (Sandbox Code Playgroud)
我的问题是"这是权限存储在数据库中的方式吗?" 有没有更好的方法来存储基于实例的权限?
请告诉我.
谢谢
我对信息的溢出有点迷茫,我需要一些指导,以最好的方式支持只向受信任的客户提供API访问.
目前的环境:
我们目前有一个集中服务器,通过Apache Shiro处理用户身份验证/授权.
我们拥有内部API,可与内部服务器进行内部通信,以验证和管理令牌.(从而启用SSO).
我们的客户端应用程序和API之间的通信通过SSL保护.
使用基于令牌的身份验证.
目标:
我们的目标是允许第三方应用程序和API与我们的集中身份验证服务器进行通信.但我们主要担心的是网络钓鱼,因为我们只希望"有效"方与我们沟通,最好不要在第三方方面公开身份验证信息.
问题:
1-实现这种架构的最佳方法是什么?我们应该继续使用OAuth吗?如果是的话,有没有一种很好的方法将它与Shiro整合?
2- OAuth也会在移动应用程序上做得很好吗?(例如,除非应用程序受信任,否则限制对REST API的访问)
3-我是否有可以与Java一起使用的OAuth提供程序库,或者OAuth只是我必须自己实现的"标准"?(例如,实现RESTful API)
4- SSO是否可以轻松支持OAuth?
抱歉模糊的问题.我只需要一般的指导和建议.
有没有办法在Shiro中实现多因素身份验证?有人能给我一个如何实现这一点的提示吗?
有关更多详细信息:基本思想是,用户需要像往常一样使用用户名和密码登录,但在进行实际身份验证之前,用户还需要输入他作为SMS收到的一次性令牌.
谢谢!
由于我目前对此的理解水平,我一直有一种行为,我只能认为是奇怪的.
我有apache版本:2.4.7在Ubuntu上代理通过AJP 1.3 tomcat 7.0.52.0运行一个spring应用程序(MVC)和apache shiro 1.2作为安全框架.
我在apache2.conf中设置了header条目,如下所示
Header always append X-Frame-Options SAMEORIGIN
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
Run Code Online (Sandbox Code Playgroud)
如果使用以下任一或所有方法在tomcat端强制执行标志,我会有相同的行为:
连接器WEB-INF/web.xml具有以下内容
<cookie-config>
<http-only>true</http-only>
<secure>true</secure>
</cookie-config>
在此之后发生的是,在/login存在安全和httponly标志时,在认证成功之后,在对服务器的任何调用期间,所有这些标志在应用内消失.一旦用户注销,标志将返回一个额外的标志:DeleteMejsessionid和RememberMe.
此/ login页面使用secure和httponly标志创建jsessionid

验证成功后,2步auth jsessionid没有标志

在帐户仪表板中也没有标志

但在注销时,旗帜又回来了

我的问题是
1:这是通常的行为
2:如果这是实际行为,这是否意味着cookie在会话ID的整个生命周期中都是安全的?
有没有办法可以限制使用Shiro角色访问Grails中的Java-Melody插件生成的/监控URL?
更新:更多细节.这是没有问题的,所以大多数Grails的资源都是shiro.但是在java旋律插件的情况下,似乎在执行shiro过滤器之前执行旋律过滤器.这使得shiro无用.
有一些解决方案可以通过改变web.xml来解决这个问题,但这不是一个快速的问题,我(rdmueller)还没有设法让它工作.web.xml插件似乎也提供了一些帮助,但我不想添加另一个插件来保护一个插件.
网上发现的一些较旧的陈述表明,通过使用loadAfter此文件中的列表已经解决了这个问题:https://github.com/javamelody/grails-melody-plugin/blob/master/GrailsMelodyGrailsPlugin.groovy - 但是似乎这只适用于旧版本的Grails.
Update2:为了更容易提出解决方案,我创建了一个Grails 2.2.4示例:https://github.com/rdmueller/SO30739581
只需克隆项目,执行操作grailsw run-app并导航到
http://localhost:8080/SO30739581/dbdoc
Run Code Online (Sandbox Code Playgroud)
你将通过shiro获得一个登录屏幕.导航
http://localhost:8080/SO30739581/monitoring
Run Code Online (Sandbox Code Playgroud)
你会在没有登录的情况下获得旋律屏幕:-(
我安装了Apache Shiro 1.4.0,并按照这个官方教程进行设置.
当我尝试使用教程中的代码进行初始化SecurityUtils时SecurityManager:
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Run Code Online (Sandbox Code Playgroud)
我收到的消息IniSecurityManagerFactory现在已被弃用,有利于Shiro的Environment.
我找不到任何教程来演示如何初始化Shiro使用Environment,其文档没有多大帮助:
Environment实例封装了Shiro运行所需的所有对象.它本质上是一个"元"对象,从中可以为应用程序获取所有Shiro组件.
通常在解析Shiro配置文件时创建Environment实例.环境实例可以存储在应用程序认为必要的任何位置,并且可以从中检索实现安全行为可能需要的任何Shiro组件.
例如,通过Environment实例可访问的最明显的组件是应用程序的securityManager.
那么,我该如何使用这种新的初始化机制呢?