Apache Shiro实现用户登录功能

Shiro进行权限控制的四种方式

1.在程序中 通过 Subject 编程方式进行权限控制。
2. 配置 Filter 实现 URL 级别粗粒度权限控制。
3. 配置代理,基于注解实现细粒度权限控制。
4. 在页面中使用 shiro 自定义标签实现 页面显示权限控制。

实现用户登录功能

配置 shiro 的 Filter 实现 URL 级别权限控制
1.配置 web.xml。

     
		
		shiroFilter
		org.springframework.web.filter.DelegatingFilterProxy
	
	
		shiroFilter
		/*
	

2.配置 applicationContext-shiro.xml。

     
	
		
		
		
		
		
		
		
		
		
		
			
				/login.html* = anon
				/user_login.action* = anon 
				/validatecode.jsp* = anon
				/css/** = anon
				/js/** = anon
				/images/** = anon
				/services/** = anon 
				/pages/base/courier.html* = perms[courier:list]
				/pages/base/area.html* = roles[base]
				/** = authc
			
		
	
	
	
		
		
	

过滤器规则参考下图:
Apache Shiro实现用户登录功能_第1张图片
3.填写表单。
4.编写 UserAction 提供 login 登录方法。

    public String login() {
		// 用户名和密码 都保存在model中
		// 基于shiro实现登录
		Subject subject = SecurityUtils.getSubject();
 
		// 用户名和密码信息
		AuthenticationToken token = new UsernamePasswordToken(
				model.getUsername(), model.getPassword());
		try {
			subject.login(token);
			// 登录成功
			// 将用户信息 保存到 Session
			return SUCCESS;
		} catch (AuthenticationException e) {
			// 登录失败
			e.printStackTrace();
			return LOGIN;
		}
	}
  1. 自定义 Realm 对象,实现认证方法 自定义 Realm 实现 Realm 接口 ,在实际开发中,只需要继承 AuthorizingRealm。
// 认证...
protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken token) throws AuthenticationException {
		System.out.println("shiro 认证管理... ");
 
		// 转换token
		UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
 
		// 根据用户名 查询 用户信息
		User user = userService.findByUsername(usernamePasswordToken
				.getUsername());
		if (user == null) {
			// 用户名不存在
			// 参数一: 期望登录后,保存在Subject中信息
			// 参数二: 如果返回为null 说明用户不存在,报用户名
			// 参数三 :realm名称
			return null;
		} else {
			// 用户名存在
			// 当返回用户密码时,securityManager安全管理器,自动比较返回密码和用户输入密码是否一致
			// 如果密码一致 登录成功, 如果密码不一致 报密码错误异常
			return new SimpleAuthenticationInfo(user, user.getPassword(),
					getName());
		}
	}
}

实现 Realm 的授权方法

    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) {
		System.out.println("shiro 授权管理...");
		SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
		// 根据当前登录用户 查询对应角色和权限
		Subject subject = SecurityUtils.getSubject();
		User user = (User) subject.getPrincipal();
		// 调用业务层,查询角色
		List roles = roleService.findByUser(user);
		for (Role role : roles) {
			authorizationInfo.addRole(role.getKeyword());
		}
		// 调用业务层,查询权限
		List permissions = permissionService.findByUser(user);
		for (Permission permission : permissions) {
			authorizationInfo.addStringPermission(permission.getKeyword());
		}
		return authorizationInfo;
	}

你可能感兴趣的:(Java)