springmvc集成shiro例子

简介: 阅读目录 仅供参考 登录部分 登录验证部分 授权部分 权限拦截配置 访问路径匹配任意角色 示例源码参考 测试 仅供参考 仅供参考 登录部分 代码: @RequestMapping(value = "/login", method = RequestMethod.

登录部分

代码:

复制代码
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    @ResponseBody
    public Map<String, Object> login(HttpServletRequest request)
    {
        Map<String, Object> resultMap = new LinkedHashMap<String, Object>();
        try
        {
            ShiroToken token = new ShiroToken("admin", "21232f297a57a5a743894a0e4a801fc3");
            token.setRememberMe(false);
            SecurityUtils.getSubject().login(token);
            ShiroToken token2 = (ShiroToken) SecurityUtils.getSubject().getPrincipal();

            logger.info(token2.getUsername() + "," + token2.getPswd());

            resultMap.put("status", 200);
            resultMap.put("message", "登录成功");

            /**
             * 获取登录之前的地址
             */
            SavedRequest savedRequest = WebUtils.getSavedRequest(request);
            String url = null;
            if (null != savedRequest)
            {
                url = savedRequest.getRequestUrl();
            }
            // 跳转地址
            resultMap.put("back_url", url);
        }
        catch (DisabledAccountException e)
        {
            resultMap.put("status", 500);
            resultMap.put("message", "帐号已经禁用。");
        }
        catch (Exception e)
        {
            resultMap.put("status", 500);
            resultMap.put("message", "帐号或密码错误");
        }
        return resultMap;
    }
复制代码

注意几点:

1、登录密码记得加密,一般存在数据库中的密码是加密过的。

2、真正开始执行登录操作的是SecurityUtils.getSubject().login(token),这个方法会调用org.apache.shiro.realm.AuthorizingRealm的doGetAuthenticationInfo方法进行登录认证:

3、出错异常记得捕获

登录验证部分

代码如下:

复制代码
   @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0)
    {
        ShiroToken token = (ShiroToken) arg0;
        String username = token.getUsername();

        // 根据username从数据库查找用户,得到密码
        // 假设找到的用户如下
        // User user = userService.findByUsername(username)
        User user = new User();
        user.setName(username);
        user.setPassword("21232f297a57a5a743894a0e4a801fc3"); // 数据库中的密码md5加密的

        if (null == user)
        {
            throw new AccountException("username is not exist");
        }
        else if (!user.getPassword().equals(token.getPswd()))
        {
            throw new AccountException("password is not right");
        }
        else
        {
            // 登陆成功
            logger.info("{} login success.", username);
        }
        return new SimpleAuthenticationInfo(arg0, user.getPassword(), username);
    }
复制代码

注意几点:

1、一般会根据username从数据库中查找该用户,得到密码

2、进行密码校验,判断一致性

3、根据获取到的用户信息,也可以进行其它判断,如用户是否激活,是否被禁用等

授权部分

代码如下:

复制代码
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0)
    {
        ShiroToken token = (ShiroToken) SecurityUtils.getSubject().getPrincipal();
        String username = token.getUsername();
        logger.info(username + "授权...");

        // 从数据库中查找该用户的角色和权限
        SimpleAuthorizationInfo sainfo = new SimpleAuthorizationInfo();

        Set<String> roles = new HashSet<String>();
        roles.add("admin");
        //roles.add("role1");
        Set<String> permissions = new HashSet<String>();
        permissions.add("add");
        permissions.add("delete");
        sainfo.setRoles(roles);
        sainfo.setStringPermissions(permissions);
        return sainfo;
    }
复制代码

注意,一般是根据用户名从数据库中查找该用户的角色和权限,进行授权;当然其它途径也是可以的,如webservice接口,配置文件等获取用户权限。

权限拦截配置

如下:

复制代码
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"></property>
        <property name="loginUrl" value="/security/view/login"></property>
        <property name="successUrl" value="/successUrl"></property>
        <!-- 用户访问未对其授权的资源时,所显示的连接 -->
        <property name="unauthorizedUrl" value="/unauthorizedUrl"></property>
        <property name="filters">
            <map>
                <entry key="anyRoles">
                    <bean class="cn.edu.hdu.ssd.core.shiro.AnyRolesAuthorizationFilter" />
                </entry>
            </map>
        </property>
        <property name="filterChainDefinitions">
            <value>
                /security/**=anon
                /test/**=roles[role1]
                /users/**=anyRoles[admin,role1]
                /**=authc
            </value>
        </property>
    </bean>
复制代码

根据用户的角色或权限来配置对应匹配的访问路径;

访问路径匹配任意角色

默认情况下,配置权限控制的时候,如

/test/**=roles[role1,admin]

结果是需要用户同时拥有role1和admin权限才能访问/test/**路径,这往往不符合我们的需求,

大部分情况,我们希望的是用户拥有role1和admin任一角色即可。

那么可以这样修改,编写一个过滤器:

复制代码
public class AnyRolesAuthorizationFilter extends AuthorizationFilter
{

    // private Logger logger =  LoggerFactory.getLogger(ShiroCasAuthFilter.class);
    @Override
    protected boolean isAccessAllowed(ServletRequest req, ServletResponse resp, Object mappedValue)
        throws Exception
    {
        Subject subject = getSubject(req, resp);
        String[] rolesArray = (String[]) mappedValue;

        if (rolesArray == null || rolesArray.length == 0)
        {
            return true;
        }
        for (int i = 0; i < rolesArray.length; i++)
        {
            if (subject.hasRole(rolesArray[i]))
            {
                return true;
            }
        }
        return false;
    }
}
复制代码

配置shiroFilter bean的filters属性,如下,

复制代码
        <property name="filters">
            <map>
                <entry key="anyRoles">
                    <bean class="cn.edu.hdu.ssd.core.shiro.AnyRolesAuthorizationFilter" />
                </entry>
            </map>
        </property>
复制代码

最后,权限拦截配置可以这样配:

/test/**=anyRoles[admin,role1]


本文转自风一样的码农博客园博客,原文链接:http://www.cnblogs.com/chenpi/p/6247956.html,如需转载请自行联系原作者
相关文章
|
2月前
|
安全 Java 数据库
后端进阶之路——万字总结Spring Security与数据库集成实践(五)
后端进阶之路——万字总结Spring Security与数据库集成实践(五)
|
3月前
|
前端开发 Java 开发者
Spring Boot 3 集成 Thymeleaf
Thymeleaf是一款用于Web和独立环境的现代化服务器端Java模板引擎。它能够处理HTML、XML、JavaScript、CSS甚至纯文本。Thymeleaf的语法简单易懂,它允许开发者在模板中嵌入表达式,以便动态地渲染数据。
77 1
Spring Boot 3 集成 Thymeleaf
|
4月前
|
Java 开发工具 git
spring boot 集成 ctrip apollo 实现动态配置更新
spring boot 集成 ctrip apollo 实现动态配置更新
48 1
|
4月前
|
SQL 监控 druid
p6spy【SpringBoot集成】使用p6spy-spring-boot-starter集成p6spy监控数据库(配置方法举例)
p6spy【SpringBoot集成】使用p6spy-spring-boot-starter集成p6spy监控数据库(配置方法举例)
188 0
|
3月前
|
NoSQL Java Redis
Spring Boot集成Redisson详细介绍
Redisson是一个用于Java的分布式和高可用的Java对象的框架,它基于Redis实现。在Spring Boot应用程序中集成Redisson可以帮助我们更轻松地实现分布式锁、分布式对象、分布式集合等功能。本文将介绍如何在Spring Boot项目中集成Redisson,并展示一些基本用法。
475 2
Spring Boot集成Redisson详细介绍
|
4月前
|
JavaScript Java 对象存储
Spring Boot集成Tinymce富文本编辑器
Spring Boot集成Tinymce富文本编辑器
|
1月前
|
Java 数据库连接 数据库
Spring Boot整合MyBatis Plus集成多数据源轻松实现数据读写分离
Spring Boot整合MyBatis Plus集成多数据源轻松实现数据读写分离
26 2
|
1月前
|
监控 NoSQL Java
Spring Boot集成Redis启动失败【Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.G】
Spring Boot集成Redis启动失败【Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.G】
|
1月前
|
存储 NoSQL Java
如何使用Spring Boot与Redis集成
2月更文挑战第12天】
52 0
|
2月前
|
Java 关系型数据库 MySQL
Shiro实战+springboot集成
Shiro实战+springboot集成
17 0

热门文章

最新文章