Também concordo que o Spring Security parece muito complicado (para mim). Certamente, eles fizeram coisas para reduzir a complexidade, como criar namespaces XML personalizados para reduzir a quantidade de configuração XML, mas, para mim, eles não abordam meu problema fundamental pessoal com o Spring Security: seus nomes e conceitos geralmente são confusos para mim. É difícil apenas 'entender'.
No momento em que você começa a usar o Shiro, você apenas 'entende'. O que era difícil de entender no mundo da segurança é muito mais fácil de entender. Coisas que são insuportavelmente difíceis de usar no JDK (por exemplo, Cifras) são simplificadas para um nível que não é apenas suportável, mas geralmente uma alegria de usar.
Por exemplo, como você hash + salt uma senha e a base64 a codifica em Java ou Spring Security? Nem são tão simples e intuitivos quanto a solução de Shiro:
ByteSource salt = new SecureRandomNumberGenerator().nextBytes();
new Sha512Hash(password, salt).toBase64();
Não há necessidade de codec comum ou qualquer outra coisa. Apenas a jarra de Shiro.
Agora, com relação aos ambientes Spring, a maioria dos desenvolvedores do Shiro usa o Spring como seu ambiente principal de aplicativos. Isso significa que a integração do Shiro ao Spring é excelente e tudo funciona excepcionalmente bem. Você pode ter certeza de que, se estiver escrevendo um aplicativo Spring, terá uma experiência de segurança completa.
Por exemplo, considere o exemplo de configuração do Spring XML em outra postagem neste segmento. Aqui está como você faria (essencialmente) a mesma coisa no Shiro:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd>
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="loginUrl" value="/login.jsp"/>
<property name="successUrl" value="/home.jsp"/>
<property name="unauthorizedUrl" value="/unauthorized.jsp"/>
<property name="filterChainDefinitions">
<value>
/secure/** = authc
/** = anon
</value>
</property>
</bean>
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="myRealm"/>
</bean>
<bean id="myRealm" class="...">
...
</bean>
Embora um pouco mais detalhado que o outro exemplo do Spring, é mais fácil ler o IMO.
Você também descobrirá que usar as definições de cadeia de filtros do Shiro é provavelmente a maneira mais fácil de definir cadeias de filtros gerais e regras de segurança baseadas na Web de todos os tempos! Muito melhor do que defini-los no web.xml.
Finalmente, Shiro oferece extrema 'conectabilidade' também. Você verá que é possível configurar e / ou substituir praticamente qualquer coisa devido à arquitetura compatível com injeção de POJO / Shiro da Shiro. O Shiro padroniza quase tudo para padrões normais e você pode substituir ou configurar apenas o necessário.
No fim das contas, acho que escolher um desses dois é mais sobre o seu modelo mental - qual dos dois faz mais sentido e é mais intuitivo para você? Para alguns, será Shiro, para outros, será Spring Security. Shiro funciona muito bem em ambientes Spring, então eu diria que escolha com base em qual dos dois você gosta mais e faz mais sentido para você.
Para saber mais sobre a integração do Shiro no Spring: http://shiro.apache.org/spring.html