Shiro SimpleAuthenticationInfo使用

SimpleAuthenticationInfo这里原理很简单,又有一些值得挖掘的东西。

        //此处使用的是user对象,不是username
        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
                user,
                user.getPassword(),
                getName()
        );

这个东西是在realm中的,第一个参数user,这里好多地方传的时候都是user对象,但是都在备注用户名。可是我如果传入username,就会报类型转换问题。

但是在开涛大神的博客中,无状态的shiro里,那边给出的例子是传username。我自己测试的,可以传username,也可以传user对象,仅限他那边一段代码。网上有文章说,这里其实是user和username的集合,后端是分两个字段接收的。由于时间的问题,没有深入里了解这块,传user对象是OK的。

第二个字段是user.getPassword(),注意这里是指从数据库中获取的password。

第三个字段是realm,即当前realm的名称。

看了几篇文章介绍说,这块对比逻辑是先对比username,但是username肯定是相等的,所以真正对比的是password。从这里传入的password(这里是从数据库获取的)和token(filter中登录时生成的)中的password做对比,如果相同就允许登录,不相同就抛出异常。

如果验证成功,最终这里返回的信息authenticationInfo 的值与传入的第一个字段的值相同(我这里传的是user对象)。

  • 20
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
好的,以下是使用Shiro写一个登录功能的示例代码: 首先,需要在pom.xml文件中添加Shiro的依赖: ``` <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.7.1</version> </dependency> ``` 然后,在Spring配置文件中配置Shiro的相关信息: ``` <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myRealm"/> </bean> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="/login"/> <property name="successUrl" value="/index"/> <property name="unauthorizedUrl" value="/unauthorized"/> <property name="filterChainDefinitions"> <value> /login = anon /logout = logout /** = authc </value> </property> </bean> <bean id="myRealm" class="com.example.MyRealm"/> ``` 其中,securityManager是Shiro的安全管理器,realm是自定义的Realm,shiroFilter是Shiro的过滤器。 接下来,实现自定义的Realm: ``` public class MyRealm extends AuthorizingRealm { @Autowired private UserService userService; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 授权逻辑 return null; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // 认证逻辑 UsernamePasswordToken upToken = (UsernamePasswordToken) token; String username = upToken.getUsername(); User user = userService.getUserByUsername(username); if (user == null) { throw new UnknownAccountException("用户名不存在"); } String password = user.getPassword(); return new SimpleAuthenticationInfo(username, password, getName()); } } ``` 其中,doGetAuthorizationInfo方法是授权逻辑,doGetAuthenticationInfo方法是认证逻辑。在认证逻辑中,首先获取用户名和密码,然后根据用户名查询数据库中的用户信息,如果用户不存在,则抛出UnknownAccountException异常,否则将用户名和密码封装成SimpleAuthenticationInfo对象返回。 最后,在Controller中处理登录请求: ``` @RequestMapping("/login") public String login(String username, String password) { Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password); try { subject.login(token); return "redirect:/index"; } catch (AuthenticationException e) { return "redirect:/login?error"; } } ``` 其中,使用SecurityUtils.getSubject()获取当前用户的Subject对象,然后使用UsernamePasswordToken封装用户名和密码,调用subject.login(token)进行登录认证,如果认证成功,则重定向到首页,否则重定向到登录页面并带上错误信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值