apache认证之shiro 框架的使用

  1. apache认证之shiro框架的使用
    –| shiro是来认证和授权的一个框架,下面是接入的主要步骤
  2. 首先的引入一栏
    –| 如果使用的maven管理,在父工程的 pom.xml文件中一如依赖
	<!-- 引入shiro框架的依赖 -->
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-all</artifactId>
			<version>1.2.2</version>
		</dependency>
  1. 然后在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>

登录的认证就成功了,相比以前的,可以参考一下

猜你喜欢

转载自blog.csdn.net/puyaCheer_xu/article/details/84862643