我目前正在评估基于Java的安全框架,我是一个Spring 3.0用户,所以SpringSecurity似乎是正确的选择,但Spring安全性似乎过于复杂,它似乎并不像是让安全性更容易实现, Shiro似乎更连贯,更容易理解.我正在寻找这两个框架之间的利弊列表.
我正在开发一个需要基于对象的身份验证和授权的服务器端应用程序.我喜欢Shiro的简单性,但为了与JAAS兼容,我编写了一个使用Apache Shiro作为底层机制的LoginModule.
但我的问题是我找不到将JAAS授权检查委托给Shiro的方法.我怎样才能做到这一点?
到目前为止我所研究的大多数人都说Apache Shiro易于使用且易于与CAS集成(用于SSO等).只是问一下是否有人有使用它们和使用哪一个的经验以及为什么一个比其他更好?
我一直在对Apache Shiro和Spring Security进行一些比较 - 我真的很喜欢Shiro使用的安全模型,并相信它比Spring Security更清晰.
但是,一个很好的方法是能够从方法级安全注释中引用方法参数.例如,现在我可以这样:
@RequiresPermissions("account:send:*")
public void sendEmail( EmailAccount account, String to, String subject, String message) { ... }
Run Code Online (Sandbox Code Playgroud)
在此示例的上下文中,这意味着经过身份验证的用户必须具有在电子邮件帐户上发送电子邮件的权限.
但是,这不是很细粒度,因为我想要实例级权限!在此上下文中,假设用户可以拥有电子邮件帐户实例的权限.所以,我想写一下这样的代码:
@RequiresPermissions("account:send:${account.id}")
public void sendEmail( EmailAccount account, String to, String subject, String message) { ... }
Run Code Online (Sandbox Code Playgroud)
通过这种方式,权限字符串引用传递给方法的参数,以便可以针对特定的EmailAccount实例保护该方法.
我知道我可以从方法中的普通Java代码轻松地做到这一点,但使用注释实现相同的东西会很棒 - 我知道Spring Security在其注释中支持Spring EL表达式.
这绝对不是Shiro的特色,因此我必须编写自己的自定义注释吗?
谢谢,
安德鲁
我正在使用以下技术开展项目:
当我在tomcat服务器上部署它时,我"JSESSIONID 456jghd787aa"在URL的末尾添加了一个.
我试图解决这个问题,但我无法做到这一点.
我正在尝试保护使用JSF2.0构建的应用程序.
我很困惑人们什么时候选择使用像Shiro,Spring Security或owasp的esapi这样的安全替代品来留下容器管理的安全性.看过Stack Overflow上的一些相关问题后,我意识到JSF开发人员过去更喜欢基于容器的安全性.但我也强烈建议使用Apache Shiro.我是安全问题的新手,不知道可能是什么相关问题以及如何处理它们.因此,我正在寻找通过其默认设置/自己处理大多数安全问题的东西.
就我的应用程序需求而言,我有一个社交应用程序,具有不同角色的用户可以访问不同的页面集,并可以根据他们的角色在这些页面上使用不同级别的功能.
在那种情况下,您认为对我来说可能是一个很好的选择吗?
我个人已经确信选择Shiro,因为它易于使用并且为新手照顾大部分事情.
您在Java项目中使用了哪些安全框架?
我使用的是Spring Security和Apache Shiro,它们看起来都不成熟.
Spring安全漏洞:
Apache Shiro缺陷:
两者都缺乏文档.
也许大多数真正的项目都会开发自己的安全框架?
我有一个简单的Web项目.我想在这个项目中访问多个角色是一个URL.
网址的sihor.ini部分
[urls]
/login.xhtml = authc
/logout = logout
/admin/** = user, roles[admin]
/guest/** = user, roles[admin,guest]
Run Code Online (Sandbox Code Playgroud)
当用户admin的角色访问来宾目录时,我收到401错误.
为什么?
shiro版本1.2.1
如何使用a JDBCRealm来处理servlet中的用户身份验证和授权?我能找到的唯一例子是创建DataSource web.xml(例如使用shiro 1.2.1对数据库进行身份验证).
我并不想在我的源代码树的数据库凭据(原因很明显),并希望通过JNDI使用上下文定义数据源,因为我有我在每一个其他的servlet项目用于任何其它目的,所有其他RDBMS我已经开发.
如何配置Shiro 从JNDI JDBCRealm获取它DataSource?
这个问题是由我的pom.xml [cxf-bundle-jaxrs]中的一个依赖项引起的,它在内部使用较低版本的slf4j.我设法通过将此依赖项升级到最新版本来解决此问题.感谢大家.
我正在尝试将Apache Shiro添加到我的CXF Spring Web应用程序中.当我启动我的tomcat 7时,我收到以下错误
Caused by: java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder;
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:121)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:111)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:268)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:241)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:254)
at org.apache.shiro.spring.LifecycleBeanPostProcessor.<clinit>(LifecycleBeanPostProcessor.java:51)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:877)
... 25 more
Run Code Online (Sandbox Code Playgroud)
我的shiro和slf4j的pom.xml是
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
<scope>runtime</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我通过谷歌搜索尝试了所有可能的解决方案,但没有运气.