1.在项目中加入依赖包,以maven为例
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.3.2</version> </dependency>
2.打开web.xml,加入相应的filter
DelegatingFilterProxy 作用是自动到 spring 容器查找名字为 shiroFilter(filter-name)的 bean 并把所有 Filter 的操作委托给它。
<filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3.spring applicationContext配置
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="cacheManager" ref="cacheManager"/> <property name="realm" ref="realmService"/> </bean> <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"> <property name="cacheManagerConfigFile" value="classpath:ehcache-shiro.xml"/> </bean> <!-- 自定义的realm,主要实现用户验证的过程 继承自org.apache.shiro.realm.AuthenticatingRealm --> <bean id="realmService" class="org.lianglong.service.RealmService"> <property name="credentialsMatcher"> <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"> <property name="hashAlgorithmName" value="SHA-256"/> <property name="hashIterations" value="1"/> </bean> </property> </bean> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
//自定义realm的实现类
package org.lianglong.service;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.apache.shiro.util.ByteSource;
import org.lianglong.model.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Resource;
public class RealmService extends AuthenticatingRealm{
private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
private UserService userService;
@Resource
public void setUserService(UserService userService) {
this.userService = userService;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException{
UsernamePasswordToken upToken = (UsernamePasswordToken)token;
String username = upToken.getUsername();
User user = userService.getUserByName(username);
log.info("登录验证 username["+username+"]");
if( user == null ){
throw new UnknownAccountException("用户不存在["+username+"]");
}
if( user.getIsLocked() > 0 ){
throw new LockedAccountException("用户已被锁定["+username+"]");
}
/*
* 由于我们启用了盐值加密,正常来说存到数据库里面的密码也是加密后的。
* 但这里是为了演示如何把对密码进行加密
*/
String enPassword = new SimpleHash("SHA-256",user.getPassword(),user.getSalt(),1).toString();
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
user.getUsername(),
enPassword,
ByteSource.Util.bytes(user.getSalt()),
getName());
return authenticationInfo;
}
}
评论