`

【shiro权限管理】7.简单shiro认证实现

 
阅读更多

 

现在在第三章的例子基础上,对代码做一些调整来实现简单的web项目认证

 

首先加入登录页面login.jsp、登录成功页面list.jsp

//登录页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>登录</title>
  </head>
  <body>
     <form action="userAuth/login" method="post">
             账号:<input type="text" name="username"><br/><br/>
             密码:<input type="password" name="password"><br/><br/>
       <input type="submit" value="登录">
     </form>
  </body>
</html>

//登录成功页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>首页</title>
  </head>
  <body>
     登录成功!欢迎访问首页O(∩_∩)O
     <a href="userAuth/logout">登出</a>
  </body>
</html>

 以及登录页面输入用户名密码之后访问的认证控制器

@Controller
@RequestMapping("userAuth")
public class ShiroLoginController {
	@RequestMapping("login")
	public String login(String username,String password){
	//获取当前的Subject
        Subject currentUser = SecurityUtils.getSubject();
        //测试当前用户是否已经被认证(即是否已经登录)
        if (!currentUser.isAuthenticated()) {
            //将用户名与密码封装为UsernamePasswordToken对象
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            token.setRememberMe(true);//记录用户
            try {
                currentUser.login(token);//调用Subject的login方法执行登录
            } catch (AuthenticationException e) {//所有认证时异常的父类
                System.out.println("登录失败:"+e.getMessage());
            } 
        }
        //跳转到登录成功页面list
		return "redirect:/list.jsp";
	}
}

 

 

然后在applicationContext.xml中shiroFilter对应url过滤机制中添加对登录、登出的放行

<property name="filterChainDefinitions">
            <value>
                /login.jsp = anon
             #登录页面点击登录后访问的这个地址必须给放行
                /userAuth/login = anon
             #这行表示访问这个地址就做出登出动作 无需自定义方法 shiro的logout拦截器会实现登出功能
                /userAuth/logout = logout
                # everything else requires authentication:
                /** = authc
            </value>
</property>

 

 

上一篇提到Shiro认证时需要一个Realm,我们已经在applicationContext.xml中配置了ShiroRealm,另外现在只运用到了Shiro的认证功能,因此我们可以让ShiroRealm继承AuthenticatingRealm,并重写它的doGetAuthenticationInfo方法。另外在本例中用户信息暂时用Map来存储,实际生产中一般从数据库中获取,一个意思

public class ShiroRealm extends AuthenticatingRealm{
	
	private static Map<String,User> userMap = new HashMap<String,User>();
	static{
                //使用Map模拟数据库获取User表信息
		userMap.put("jack", new User("jack","123",false));
		userMap.put("tom", new User("tom","123",false));
		userMap.put("jean", new User("jean","123",true));
	}
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken token) throws AuthenticationException {
		//1.把AuthenticationToken转换为UsernamePasswordToken
		UsernamePasswordToken userToken = (UsernamePasswordToken) token;
		//2.从UsernamePasswordToken中获取username
		String username = userToken.getUsername();
		//Map模拟数据库取数据
		User u = userMap.get(username);
		//4.若用户不行存在,可以抛出UnknownAccountException
		if(u==null){
			throw new UnknownAccountException("用户不存在");
		}
		//5.若用户被锁定,可以抛出LockedAccountException
		if(u.isLocked()){
			throw new LockedAccountException("用户被锁定");
		}
		//6.根据用户的情况,来构建AuthenticationInfo对象,通常使用的实现类为SimpleAuthenticationInfo
		//以下信息是从数据库中获取的
		//1)principal:认证的实体信息,可以是username,也可以是数据库表对应的用户的实体对象
		Object principal = u.getUsername();
		//2)credentials:密码
		Object credentials = u.getPassword();
		//3)realmName:当前realm对象的name,调用父类的getName()方法即可
		String realmName = getName();
		SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(principal,credentials,realmName);
		return info;
	}
}

 其中User

public class User {
	private String username;
	private String password;
	private boolean locked;
	public User(String username, String password, boolean locked) {
		super();
		this.username = username;
		this.password = password;
		this.locked = locked;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public boolean isLocked() {
		return locked;
	}
	public void setLocked(boolean locked) {
		this.locked = locked;
	}
}

 至此我们的一个简单的Shiro校验工程编写完毕。可以运行项目做一些简单的测试

 

注意我们使用的AuthenticationInfo对象为SimpleAuthenticationInfo实现类,而一般密码都是会进行加密的,所以当加密的时候要使用其它类型的AuthenticationInfo实现类,这个在下一篇总结中会提到。

 

分享到:
评论

相关推荐

    springboot-shiro权限管理系统.zip

    总的来说,"springboot-shiro权限管理系统"是一个集成了SpringBoot、Shiro和Bootstrap的高效解决方案,它为开发者提供了便捷的身份认证、权限控制和日志管理功能,是构建企业级Web应用的理想选择。通过理解和掌握这...

    shiro权限管理框架.pdf

    Shiro是一个开源的Java安全框架,用于实现用户认证、授权、加密、会话管理等功能。它抽取了软件系统中安全认证相关的功能,形成一个通用的安全认证框架,不仅适用于JavaSE环境,同样适用于JavaEE环境。Shiro的使用...

    移动互联网场景下服务端Shiro权限管理研究.pdf

    移动互联网场景下服务端Shiro权限管理研究 1. 背景介绍 在移动互联网时代,Web系统、App和微信小程序等多种形式的混合应用层出不穷。随之而来的是权限管理的复杂性显著增加。当前的系统权限管理存在授权方式复杂、...

    管理系统系列--Spring Boot &amp; Shiro 权限管理系统.zip

    【标题】"管理系统系列--Spring Boot & Shiro 权限管理系统.zip" 提供了一个基于Spring Boot和Apache Shiro实现的权限管理系统的实例。这个压缩包可能包含了一个完整的项目结构,用于展示如何在Java环境中构建一个...

    【SpringBoot】廿三、SpringBoot中整合Shiro实现权限管理.pdf

    【SpringBoot】与Apache Shiro整合进行权限管理是构建安全Web应用的一种常见方式。Shiro是一个轻量级、易用的Java安全框架,提供身份验证、授权、密码管理和会话管理功能。它通过简单的API使得开发者能快速为各种...

    spring boot+shiro 权限认证管理案例

    通过以上步骤,我们可以构建一个集成了 Spring Boot 和 Shiro 的权限认证管理系统,能够实现用户登录、权限校验、会话管理等功能,同时利用缓存提升系统性能。在实际开发中,还可以根据需求扩展 Shiro 功能,例如...

    shiro1.7.1.zip

    Apache Shiro 是一个强大且易用的Java安全框架,提供了身份认证、授权、加密和会话管理功能,简化了企业级应用的安全实现。标题中的"shiro1.7.1.zip"表明这是一个包含Apache Shiro 1.7.1版本所有核心模块的压缩包,...

    【SpringBoot】廿三、SpringBoot中整合Shiro实现权限管理.docx

    在本文中,我们将深入探讨如何在SpringBoot应用中整合...通过以上步骤,你可以在SpringBoot应用中有效地实现权限管理,使得用户认证和授权变得简单而高效。Shiro的灵活性和易用性使其成为Java安全框架的优秀选择。

    shiro_tool.zip

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。在"shiro_tool.zip"这个压缩包中,我们可以推测可能包含了一些关于Shiro使用的工具类、...

    shiro.freemarker.ShiroTags已打包

    Apache Shiro 是一个强大且易用的 Java 安全框架,它提供了认证、授权、加密和会话管理功能,简化了开发人员在应用程序中处理安全问题的复杂性。ShiroTags 是 Shiro 提供的一套用于模板引擎的标签库,如 Freemarker ...

    shiro-1.7.1.zip

    通过这些组件,开发者可以轻松地在Web应用中集成安全控制,实现用户认证、权限分配、会话管理以及加密等操作,而无需深入理解底层复杂的安全机制。Shiro的易用性和灵活性使其成为Java开发者在构建安全应用时的首选...

    SpringMVC+Shiro权限管理.

    ### SpringMVC+Shiro权限管理系统详解 #### 权限管理概述 权限管理在软件开发中扮演着至关重要的角色,特别是在涉及多用户交互的应用场景下。通过合理的权限控制,可以确保不同用户仅能访问和操作他们被授权的功能...

    管理系统系列--SpringBoot+Shiro权限管理系统脚手架.zip

    Spring Boot以其简洁的配置和快速开发的特点,已经成为Java Web开发的主流选择,而Shiro则是一款轻量级的安全框架,提供了认证、授权、会话管理和密码加密等功能,使得权限管理变得简单易行。 首先,我们要理解...

    shiro简单的demo.zip

    **标题解析:**"shiro简单的demo.zip" 这个标题表明我们正在处理一个关于Apache Shiro的简单演示项目,这个项目已经集成了SpringBoot框架,并且使用Redis作为缓存来处理权限认证。Shiro是一个强大的Java安全框架,...

    shiro 2.alpha.0

    Apache Shiro 是一个强大且易用的 Java 安全框架,提供认证、授权、加密和会话管理功能,可简化企业级应用的安全实现。Shiro 2.alpha.0 是该框架的一个早期版本,包含了框架的核心组件和相关源代码,便于开发者理解...

    Shiro核心jar包.rar

    Apache Shiro是一个强大的Java安全框架,它提供了身份验证、授权、加密和会话管理功能,为开发人员构建安全的应用程序提供了便利。在这个“Shiro核心jar包.rar”压缩包中,包含的是Apache Shiro的核心库文件“shiro-...

Global site tag (gtag.js) - Google Analytics