用Shiro实现简单的身份验证
来源:互联网 发布:底盘弹簧增高垫淘宝 编辑:程序博客网 时间:2024/05/22 09:00
用Shiro实现简单的身份验证
注意:记住一点,Shiro 不会去维护用户、维护权限;这些需要我们自己去设计 / 提供;然后通过相应的接口注入给 Shiro 即可。
也就是实现Realm接口
在 shiro 中,用户需要提供 principals (身份)和 credentials(证明)给 shiro,从而应用能验证用户身份:
principals:身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。一个主体可以有多个 principals,但只有一个 Primary principals,一般是用户名 / 密码 / 手机号。
credentials:证明 / 凭证,即只有主体知道的安全值,如密码 / 数字证书等。
首先加入Maven依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.2</version> </dependency></dependencies>
加入JUnit测试
public class LoginLogoutTest { @Test public void testHelloWorld(){ Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); //得到SecurityManager实例,并绑定给SecurityUtils SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); //得到Subject及创建用户名/密码身份的Token Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("gao","520"); try { subject.login(token); }catch (AuthenticationException e){ System.out.println("身份验证失败"); } Assert.assertEquals(true,subject.isAuthenticated()); //退出 subject.logout(); }}
从上面的代码可以看到,使用Shiro需要进行以下的步骤
- 首先通过 new IniSecurityManagerFactory 并指定一个 ini 配置文件来创建一个 SecurityManager 工厂;
- 接着获取 SecurityManager 并绑定到 SecurityUtils,这是一个全局设置,设置一次即可;
通过 SecurityUtils 得到 Subject,其会自动绑定到当前线程;如果在 web 环境在请求结束时需要解除绑定;然后获取身份验证的 Token,如用户名 / 密码;
调用 subject.login 方法进行登录,其会自动委托给 SecurityManager.login 方法进行登录;
如果身份验证失败请捕获 AuthenticationException 或其子类,常见的如: DisabledAccountException(禁用的帐号)、LockedAccountException(锁定的帐号)、UnknownAccountException(错误的帐号)、ExcessiveAttemptsException(登录失败次数过多)、IncorrectCredentialsException (错误的凭证)、ExpiredCredentialsException(过期的凭证)等,具体请查看其继承关系;对于页面的错误消息展示,最好使用如 “用户名 / 密码错误” 而不是 “用户名错误”/“密码错误”,防止一些恶意用户非法扫描帐号库;
最后可以调用 subject.logout 退出,其会自动委托给 SecurityManager.logout 方法退出。
可以通过实现Realm接口,来获取自己的验证规则
public class MyRealm1 implements Realm { @Override public String getName() { return "myrealm1"; } @Override public boolean supports(AuthenticationToken authenticationToken) { return authenticationToken instanceof UsernamePasswordToken; } @Override public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String testName = "gao"; String testPassword = "520"; //得到用户名 String userName = (String) token.getPrincipal(); System.out.println("得到的用户名为"+userName); //得到密码 String password = new String((char[]) token.getCredentials()); System.out.println("得到的密码为"+password); if (!testName.equals(userName)){ throw new UnknownAccountException(); } if (!testPassword.equals(password)){ //代表密码错误 throw new IncorrectCredentialsException(); } return new SimpleAuthenticationInfo(userName,password,getName()); }}
使用自己重写的规则之后,在shiro.ini文件中进行一些配置,文件存放在resources目录下
myRealm1 = com.gaojiancheng.demo.shiro.MyRealm1securityManager.realms = $myRealm1
运行测试代码,正确则测试通过
- 用Shiro实现简单的身份验证
- shiro 简单的身份验证 案例
- Shiro处理简单的身份验证的分析及实例
- Shiro中最简单的一个身份验证例子
- shiro身份验证入门结合shiro的MD5加密技术自定义Realm-简单Demo
- 如何:实现简单的 Forms 身份验证
- 如何:实现简单的 Forms 身份验证
- 如何:实现简单的 Forms 身份验证
- shiro 身份验证
- shiro 身份验证
- Shiro身份验证
- Shiro身份验证
- shiro身份验证
- Shiro身份验证
- 安全验证框架使用笔记002---Shiro实现基本的身份验证
- jfinal+freemarker+shiro的简单实现
- 用NodeJS完成简单的身份验证
- Formsh身份验证及简单的数据库身份验证
- centos6.x 升级gcc到4.9
- 值传递、指针传递、引用传递
- 算法(一)枚举问题
- vi编辑器-1.vi快捷键
- PHP MySQL 预处理语句
- 用Shiro实现简单的身份验证
- OpenCV人脸检测例程分析
- 81. Search in Rotated Sorted Array II
- linux 内核升级
- python自定义模块
- ELK之nginx日志的简单收集
- 静态代码分析 cpplint
- idea使用-1.快捷键
- 搭建阿里云服务器(ubuntu)时遇到的问题(一)