学习shiro认证授权?看这一篇就够了!史上最傻瓜式儿用法讲解!(shiro如何实现认证和授权)

写在前面

什么事Shiro

Shiro是一个强大易用的Java安全框架,用在身份验证、授权、密码学和会话管理。有了Shiro易于理解的API,我们可以快速、轻松地获得任何应用程序,从小的移动应用程序到大的网络甚至企业应用程序都是可以的。

Shiro的主要框架图:

学习shiro认证授权?看这一篇就够了!史上最傻瓜式儿用法讲解!(shiro如何实现认证和授权)

走进shiro

Subject是主体,外部应用与subject进行交互,subject则会记录当前操作用户,将用户的概念理解为当前操作的主体,可以是一个通过浏览器请求的用户,也可以是一个运行的程序。 Subject在shiro中是一个接口,接口中定义了很多认证授相关的方法,外部程序通过subject进行认证授权,而subject是通过SecurityManager安全管理器进行认证授权的。

SecurityManager

SecurityManager是安全管理器,对全部的subject进行安全管理,它是shiro的核心,负责对所有的subject进行安全管理。通过SecurityManager可以完成subject的认证、授权等,实质上SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过sessionManager进行会话管理等。

SecurityManager是一个接口,同时它自身也继承了Authenticator, Authorizer, SessionManager这三个接口。

学习shiro认证授权?看这一篇就够了!史上最傻瓜式儿用法讲解!(shiro如何实现认证和授权)

Authorizer

Authorizer是授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。

Authenticator

Authenticator是认证器,可以对用户身份进行认证,Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数需求,也可以自定义认证器。

realm

Realm是领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据,比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。

说明:

不要将realm理解成单单从数据源取数据,在realm中还有认证授权校验相关的代码。

SessionDAO

SessionDAO是会话dao层,是对session会话操作的一套接口,比如要将session存储到数据库,可以通过jdbc将会话存储到数据库。

sessionManager

sessionManager是会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它成为单点登录的利器。

Cryptography

Cryptography是密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。

CacheManager

CacheManager是缓存管理,将用户权限数据存储在缓存,这样可以提高性能。


shiro认证与授权的具体实现

学习shiro认证授权?看这一篇就够了!史上最傻瓜式儿用法讲解!(shiro如何实现认证和授权)

第一步:添加jar包

<!– shiro –> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency>

第二步:配置web.xml

<filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <!– 设置true由servlet容器控制filter的生命周期 –> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

第三步:自定义Realm 继承AuthorizingRealm 重写 AuthorizationInfo(授权) 和 AuthenticationInfo(认证)

简单的测试 根据个人的设置和需求改变的。现在数据是死的,运用的时候需要从数据库中得到

/** * @author IT讲坛 * @date 2018/12/26 14:05 */public class CustomRealm extends AuthorizingRealm { /** * 授权 * @param principalCollection * @return */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { String userName = (String) principalCollection.getPrimaryPrincipal(); List<String> permissionList=new ArrayList<String>(); permissionList.add(\”user:add\”); permissionList.add(\”user:delete\”); if (userName.equals(\”zhou\”)) { permissionList.add(\”user:query\”); } SimpleAuthorizationInfo info=new SimpleAuthorizationInfo(); info.addStringPermissions(permissionList); info.addRole(\”admin\”); return info; } /** * 认证 * @param authenticationToken * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { String userName = (String) authenticationToken.getPrincipal(); if (\”\”.equals(userName)) { return null; } SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userName,\”123456\”,this.getName()); return info; }}

第四步:配置spring-shiro.xml

<?xml version=\”1.0\” encoding=\”UTF-8\”?><beans xmlns=\”http://www.springframework.org/schema/beans\” xmlns:xsi=\”http://www.w3.org/2001/XMLSchema-instance\” xsi:schemaLocation=\”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\”> <!–开启shiro的注解–> <bean id=\”advisorAutoProxyCreator\” class=\”org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator\”> <property name=\”proxyTargetClass\” value=\”true\”></property> </bean> <bean class=\”org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor\”/> <!–注入自定义的Realm–> <bean id=\”customRealm\” class=\”com.test.realm.CustomRealm\”></bean> <bean id=\”securityManager\” class=\”org.apache.shiro.web.mgt.DefaultWebSecurityManager\”> <property name=\”realm\” ref=\”customRealm\”></property> </bean> <!–配置ShiroFilter–> <bean id=\”shiroFilter\” class=\”org.apache.shiro.spring.web.ShiroFilterFactoryBean\”> <property name=\”securityManager\” ref=\”securityManager\”></property> <!–登入页面–> <property name=\”loginUrl\” value=\”/login.jsp\”></property> <!–登入成功页面–> <property name=\”successUrl\” value=\”/index.jsp\”/> <property name=\”filters\”> <map> <!–退出过滤器–> <entry key=\”logout\” value-ref=\”logoutFilter\” /> </map> </property> <!–URL的拦截–> <property name=\”filterChainDefinitions\” > <value> /share = authc /logout = logout </value> </property> </bean> <!–自定义退出LogoutFilter–> <bean id=\”logoutFilter\” class=\”com.test.filter.SystemLogoutFilter\”> <property name=\”redirectUrl\” value=\”/login\”/> </bean></beans>

说明:

securityManager: 这个属性是必须的。

loginUrl: 没有登录的用户请求需要登录的页面时自动跳转到登录页面,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面。

successUrl: 登录成功默认跳转页面,不配置则跳转至”/”。如果登陆前点击的一个需要登录的页面,则在登录自动跳转到那个需要登录的页面。不跳转到此。

unauthorizedUrl: 没有权限默认跳转的页面。

Shiro中默认的过滤器:

学习shiro认证授权?看这一篇就够了!史上最傻瓜式儿用法讲解!(shiro如何实现认证和授权)

在spring中直接引入<import resource=\”spring-shiro.xml\”></import>

第五步:在spring-mvc.xml中配置权限的控制 异常的跳转

<bean class=\”org.springframework.web.servlet.handler.SimpleMappingExceptionResolver\”> <property name=\”exceptionMappings\”> <props> <!–表示捕获的异常 –> <prop key=\”org.apache.shiro.authz.UnauthorizedException\”> <!–捕获该异常时跳转的路径 –> /403 </prop> <!–表示捕获的异常 –> <prop key=\”org.apache.shiro.authz.UnauthenticatedException\”> <!–捕获该异常时跳转的路径 –> /403 </prop> </props> </property> </bean>

写在文末

最后给小伙伴们举几个配置实例

/admin=authc,roles[admin] 表示用户必需已通过认证,并拥有admin角色才可以正常发起’/admin’请求

/edit=authc,perms[admin:edit] 表示用户必需已通过认证,并拥有admin:edit权限才可以正常发起’/edit’请求

/home=user 表示用户不一定需要已经通过认证,只需要曾经被Shiro记住过登录状态就可以正常发起’/home’请求

欢迎大家多多关注,评论留言区多多互动,交流学习心得。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年8月25日 上午10:31
下一篇 2022年8月25日 上午10:45

相关推荐