- apache认证之shiro框架的使用
–| shiro是来认证和授权的一个框架,下面是接入的主要步骤 - 首先的引入一栏
–| 如果使用的maven管理,在父工程的 pom.xml文件中一如依赖
<!-- 引入shiro框架的依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.2.2</version>
</dependency>
- 然后在web.xml文件配置过滤器(如果使用了struts),那么这个过滤器要配置在struts过滤去之前:
<!-- 配置shiro过滤器 start -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置shiro过滤器 end -->
4.配置到这里,是运行不起来的,如果运行报一个
org.springframework.beans.factory.noSuchBeanDefinitionException:No bean "shiroFilter" is defined
5.这个是因为 shiroFilter并没有工厂创建.所以还要在spring中配置bean,也就是 application.xml文件找那个配置以下的内容
<bean name="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 配置属性安全管理器 -->
<property name="securityManager" ref="securityManager"></property>
<!-- 配置登录的Url,如果没有登录,直接跳转到 登录的界面 -->
<property name="loginUrl" value="/login.jsp"></property>
<!-- 配置登录之后的界面 -->
<property name="successUrl" value="/index.jsp"></property>
<!-- 配置没有认证的Url -->
<property name="unauthorizedUrl" value="unauthorized.jsp"></property>
<!-- 配置Url拦截的策略 -->
<property name="filterChainDefinitions">
<value>
/css/** = anon //这个表示css文件下所有文件可以匿名访问,不认证,下面也是一样
/js/** = anon
/images/** = anon
/login.jsp* =anon
/validatecode.jsp* = anon
/userAction_login.action = anon
/page_base_staff.action=perms["staff"] //这个表示这个action需要认证staff权限
/* = authc //其他所访问都要认证
</value>
</property>
</bean>
<!-- 安全管理器 -->
<bean name="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"></bean>
其中 securityManager,loginUrl,successUrl,unauthorizedUrl,filterChainDefinitions,filterChainDefinitions这些都是shiro框架中ShiroFilterFactoryBean工厂bean中的属性
5.配置到这里,基本接入完毕
6.接下来修改我原来的登录方法校验一下,这个是老的登录校验
/**
*
* 登录*/
public String login_bak() {
System.out.println(checkcode);
String key = (String) ServletActionContext.getRequest().getSession().getAttribute("key");
System.out.println(checkcode +"----------------------------" +key );
if(StringUtils.isNotBlank(checkcode) && checkcode.equals(key) ) {
//输入的验证码是正确的
User user = userService.findUserByUserNameAndPsw(model);
if(user !=null) {
//保存user
ServletActionContext.getRequest().getSession().setAttribute("user", user);
//登录成功
return "home";
}else {
//登录失败
this.addActionError("用户名或者密码错误!");
return LOGIN;
}
}else {
//输入的验证码是错误的
//返回错误信息
this.addActionError("输入的验证码错误!");
return LOGIN;
}
}
7.这个是新的登录校验
/**
*
* 登录*/
public String login() {
System.out.println(checkcode);
//获取Session中随机生成的验证码
String key = (String) ServletActionContext.getRequest().getSession().getAttribute("key");
System.out.println(checkcode +"----------------------------" +key );
if(StringUtils.isNotBlank(checkcode) && checkcode.equals(key) ) {
//输入的验证码是正确的
//使用shiro框架提供的方式认证
//获取当前的登录用户名,现在的状态是 "没有认证过的"
Subject subject = SecurityUtils.getSubject();
//用户名密码令牌
AuthenticationToken token = new UsernamePasswordToken(model.getUsername(),MD5Utils.md5(model.getPassword()));
try{
subject.login(token); //这个方法没有返回值,验证不通过会抛出异常,这个方法就会调用安全管理器,安全管理器就会去调用realm
//拿到登录的用户
User user = (User) subject.getPrincipal();
ServletActionContext.getRequest().getSession().setAttribute("user", user);
}catch(Exception e){
e.printStackTrace();
return LOGIN;
}
return "home";
}else {
//输入的验证码是错误的
//返回错误信息
this.addActionError("输入的验证码错误!");
return LOGIN;
}
}
8.写一个登录的realm
public class BOSRealm extends AuthorizingRealm{
@Autowired
private IUserDao userDao;
// 认证的方法
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// TODO Auto-generated method stub
System.out.println("");
UsernamePasswordToken paswtoken = (UsernamePasswordToken) token;
String username = paswtoken.getUsername();
//根据用户名查询密码
User user = userDao.findUserByUsername(username);
//没查到直接返回null realm直接抛异常
if(user == null) {
return null;
}
//框架负责比对 输入的密码和 页面输入的即token中的密码
AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());
return info;
}
//授权的方法
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection token) {
// TODO Auto-generated method stub
return null;
}
}
注意:两个方法逻辑不要搞反了 ,否则永远登录不进去的
最后将写好的BOSRealm注册给安全管理器
<!-- 安全管理器 -->
<bean name="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="bosRealm"></property>
</bean>
<bean name="bosRealm" class="com.puya.bos.realm.BOSRealm"></bean>
登录的认证就成功了,相比以前的,可以参考一下