shiro入门

SHIRO框架

  1. shiro能做什么?

    **认证**:验证用户的身份认证:验证用户的身份
    

    授权:对用户执行访问控制:判断用户是否被允许做某事

    会话管理:在任何环境下使用 Session API,即使没有 Web 或EJB 容器。

    加密:以更简洁易用的方式使用加密功能,保护或隐藏数据防止被偷窥

    Realms:聚集一个或多个用户安全数据的数据源

    单点登录(SSO)功能。

    为没有关联到登录的用户启用 "Remember Me“ 服务

  2. shiro四大核心

  3. List item

       **Authentication**(身份验证):简称为“登录”,即证明用户是谁。
      **Authorization**(授权):访问控制的过程,即决定是否有权限去访问受保护的资源。
      **Session Management**(会话管理):管理用户特定的会话,即使在非 Web 或 EJB 应用程序。
      **Cryptography**(加密):通过使用加密算法保持数据安全
    

shiro 三个核心组件

  • securityManager shiro核心组件 类似springmvc的 前端控制器
    subject 交互对象
    realms 实质上是一个dao需要实现doGetAuthenticationInfo和doGetAuthorizationInfo分别进行认证和授权

登录

@RequestMapping("/shiro-login")
    public String login(@RequestParam("username") String username, 
            @RequestParam("password") String password){
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);        
        try {
            **//执行认证操作.** 
            subject.login(token);
        }catch (AuthenticationException ae) {
            System.out.println("登陆失败: " + ae.getMessage());
            return "/index";
        }
        
        return "/shiro-success";
    }

Myrealms

package com.wql.config;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

import com.wql.pojo.TbPermission;
import com.wql.pojo.TbRole;
import com.wql.pojo.TbUser;
import com.wql.service.TbUserService;

/**
 * 自定义realm
 * @author weiqilong
 * CREATE TIME 2018年11月5日 下午4:21:24
 */
public class MyShiroRealm extends AuthorizingRealm{
	
	
	public final Log logger = LogFactory.getLog(getClass());
	
	@Autowired
	@Qualifier("tbUserServiceImpl")
	private TbUserService tbUserService;
	
	
	/**
	 * 授权
	 * 调用下面的方法,程序才会进入授权的方法
	 * System.out.println("测试一下... 是否进入了授权方法 ");
	 * boolean permitted = SecurityUtils.getSubject().isPermitted("user:add");
		System.out.println("测试一下 是否进入了授权方法 "+permitted);
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
		TbUser currentUser = (TbUser)principalCollection.getPrimaryPrincipal();
		logger.info("自定义realm 授权方法的身份="+currentUser);
		
		List<TbRole> rolesObj = currentUser.getRoles();
		List<String> rolesIds = null;
		List<String> permissionNames = null;
		
		if(null != rolesObj && rolesObj.size()>0){
			rolesIds = new ArrayList<>();
			for (TbRole role : rolesObj) {
				rolesIds.add(role.getId().toString());
				
				List<TbPermission> permissions = role.getPermissions();
				if(null != permissions && permissions.size()>0){
					permissionNames = new ArrayList<>();
					for (TbPermission tbPermission : permissions) {
						permissionNames.add(tbPermission.getPermission());
					}
				}
			}
		}
		
		SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
		info.addRoles(rolesIds);
		info.addStringPermissions(permissionNames);
		return info;
	}
	
	/**
	 * 认证
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		/*UsernamePasswordToken utoken = (UsernamePasswordToken)token;
		String username = utoken.getUsername();//客户端传过来的用户名
		String password = new String(utoken.getPassword());//客户端传过来的密码
		Object principal = token.getPrincipal();//客户端传过来的密码
		*/
		
		Object username = token.getPrincipal();//客户端传过来的用户名
		
		
		TbUser tbUser = tbUserService.getTbUserByUsername(String.valueOf(username));//从数据库查询出来的用户对象
		if(null == tbUser){
			return null;
		}
		
		//生成盐
		String saltString = tbUser.getSalt();
		ByteSource salt = ByteSource.Util.bytes(saltString);
		
		/*
		 * 这里不需要把客户端传过来的密码自己md5,shiro会自己完成处理
		 * 测试的时候,可以打开此处
		 */
		//客户端密码md5加密
		/*SimpleHash passwordhash = new SimpleHash(Constant.SHIRO_HASH_TYPE, password, salt, Constant.SHIRO_HASH_COUNT);
		logger.info("客户端密码="+password+",加密后="+passwordhash);*/
		
		String username2 = tbUser.getUsername();
		logger.info("查询的用户="+username2);
		
		SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
				tbUser, //用户对象
				tbUser.getPassword(), //密码
				salt,//盐
				this.getName());
		
		return authenticationInfo;
	}

}

config配置

package com.wql.config;

import java.util.LinkedHashMap;
import java.util.Map;

import javax.servlet.Filter;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.shiro.authc.credential.CredentialsMatcher;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.wql.constant.Constant;
import com.wql.filter.CaptchaValidateFilter;
import com.wql.filter.TokenFilter;

/**
 * shiro配置
 * @author weiqilong
 * CREATE TIME 2018年11月5日 下午4:10:08
 * 
 * Filter Chain定义说明:

	1、一个URL可以配置多个Filter,使用逗号分隔
	2、当设置多个过滤器时,全部验证通过,才视为通过
	3、部分过滤器可指定参数,如perms,roles
	Shiro内置的FilterChain
	
	Filter Name	Class
	anon	org.apache.shiro.web.filter.authc.AnonymousFilter
	authc	org.apache.shiro.web.filter.authc.FormAuthenticationFilter
	authcBasic	org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
	perms	org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
	port	org.apache.shiro.web.filter.authz.PortFilter
	rest	org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
	roles	org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
	ssl	org.apache.shiro.web.filter.authz.SslFilter
	user	org.apache.shiro.web.filter.authc.UserFilter
	anon:所有url都都可以匿名访问
	authc: 需要认证才能进行访问
	user:配置记住我或认证通过可以访问
	captchaVaildate:验证码验证通过访问
 */
@Configuration
public class ShiroConfig {
	
	public final Log logger = LogFactory.getLog(getClass());
	
	@Bean
	public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") SecurityManager securityManager){
		ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
		bean.setSecurityManager(securityManager);
		bean.setLoginUrl("/login");
		bean.setSuccessUrl("/");
		bean.setUnauthorizedUrl("/403");
		
		//顺序判断 自上而下
		Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
		/*
		 * 配置不会拦截的链接
		 */
		filterChainDefinitionMap.put("/static/**", "anon");
		filterChainDefinitionMap.put("/css/**", "anon");
		filterChainDefinitionMap.put("/images/**", "anon");
		filterChainDefinitionMap.put("/js/**", "anon");
		filterChainDefinitionMap.put("/json/**", "anon");
		filterChainDefinitionMap.put("/layui/**", "anon");
		filterChainDefinitionMap.put("/tologin", "captchaVaildate");
		filterChainDefinitionMap.put("/captcha/**", "anon");
		filterChainDefinitionMap.put("/test/**", "anon");
		//配置退出,shiro实现了
		filterChainDefinitionMap.put("/logout", "logout");
		//filterChainDefinitionMap.put("/login", "anon");
		/*
		 * 配置其他,其他的都要认证
		 * 注意!!这个一定要卸载最后!!!!!!
		 * 可以配置多个过滤器。例如 
		 *  /user/** = authc,roles[admin]
            /test/** = authc,perms[测试用的lkkk]
		 */
		filterChainDefinitionMap.put("/**", "authc,mytokentest");
		//filterChainDefinitionMap.put("/**", "anon");//测试使用
		
		
		/*
		 * 添加过滤器
		 */
		Map<String, Filter> filters = bean.getFilters();
		filters.put("captchaVaildate", new CaptchaValidateFilter());//验证码过滤器
		filters.put("mytokentest", new TokenFilter());//测试token
		
		bean.setFilterChainDefinitionMap(filterChainDefinitionMap);
		
		return bean;
	}
	
	/**
	 * 安全管理器
	 * @author weiqilong
	 * CREATE TIME 2018年11月7日 下午6:50:11
	 * @param myShiroRealm 自定义realm
	 * @return
	 */
	@Bean("securityManager")
	public SecurityManager securityManager(@Qualifier("myShiroRealm")MyShiroRealm myShiroRealm){
		DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
		securityManager.setRealm(myShiroRealm);
		return securityManager;
	}
	
	/**
	 * 自定义realm
	 * @author weiqilong
	 * CREATE TIME 2018年11月7日 下午6:45:44
	 * @param credentialsMatcher 加入自己写的密码加密
	 * @return
	 */
	@Bean("myShiroRealm")
	public MyShiroRealm myShiroRealm(@Qualifier("md5CredentialsMatcher")CredentialsMatcher credentialsMatcher){
		MyShiroRealm realm = new MyShiroRealm();
		realm.setCredentialsMatcher(credentialsMatcher);
		return realm;
	}
	
	/**
	 * 密码加密方式
	 * @author weiqilong
	 * CREATE TIME 2018年11月7日 下午6:44:49
	 * @return
	 */
	@Bean("md5CredentialsMatcher")
	public CredentialsMatcher credentialsMatcher(){
		HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher(Constant.SHIRO_HASH_TYPE);
		credentialsMatcher.setHashIterations(Constant.SHIRO_HASH_COUNT);
		return credentialsMatcher;
	}
}

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页