外链论坛

 找回密码
 立即注册
搜索
查看: 71|回复: 2

Shiro的原理及Web搭建

[复制链接]

2787

主题

316

回帖

9191万

积分

论坛元老

Rank: 8Rank: 8

积分
91919882
发表于 2024-7-27 17:06:24 | 显示全部楼层 |阅读模式

Shiro(Java安全框架)

以下都是综合之前的人加上自己的有些小总结~

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、秘码学和会话管理。运用Shiro的易于理解的API,您能够快速、容易得到任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

Shiro 重点分为来个部分便是认证和授权,在个人感觉来看便是查找数据库做相应的判断罢了,Shiro只是一个框架罢了,其中的内容需要自己的去构建,前后是自己的,中间是Shiro帮咱们去搭建和配置好的

个人认为需要看一下其中的有些源码,更有帮忙的深入的去认识Shiro的原理。

Shiro的重点框架图如下:

办法类的走向:

有些其中的办法的简单说明:

Subject

Subject即主体,外边应用与subject进行交互,subject记录了当前操功效户,将用户的概念理解为当前操作的主体,可能是一个经过浏览器请求的用户,可能是一个运行的程序。 Subject在shiro中是一个接口,接口中定义了非常多认证授关联办法外边程序经过subject进行认证授,而subject是经过SecurityManager安全管理器进行认证授权

SecurityManager

SecurityManager即安全管理器,对所有的subject进行安全管理,它是shiro的核心,负责对所有的subject进行安全管理。经过SecurityManager能够完成subject的认证、授权等,实质上SecurityManager是经过Authenticator进行认证,经过Authorizer进行授权,经过SessionManager进行会话管理等。

SecurityManager是一个接口,继承了Authenticator, Authorizer, SessionManager这三个接口。

Authenticator

Authenticator即认证器,对用户身份进行认证,Authenticator是一个接口,shiro供给ModularRealmAuthenticator实现类,经过ModularRealmAuthenticator基本上能够满足大都数需要能够自定义认证器。

Authorizer

Authorizer即授权器,用户经过认证器认证经过,在拜访功能时需要经过授权器判断用户是不是有此功能的操作权限。

realm

Realm即行业,相当于datasource数据源,securityManager进行安全认证需要经过Realm获取用户权限数据,例如倘若用户身份数据在数据库那样realm就需要从数据库获取用户身份信息。

重视:不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的关联的代码。

sessionManager

sessionManager即会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,因此shiro能够运用在非web应用上,能够将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。

SessionDAO

SessionDAO即会话dao,是对session会话操作的一套接口,例如要将session存储到数据库,能够经过jdbc将会话存储到数据库。

CacheManager

CacheManager即缓存管理,将用户权限数据存储在缓存,这般能够加强性能。

Cryptography

Cryptography即秘码管理,shiro供给了一套加密/解密的组件,方便研发例如供给常用的散列、加/解密等功能。

Shiro认证与授权的在Web中实现

第1步:添加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

<!-- shiro 过滤器 start -->  <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>  <!-- shiro 过滤器 end -->

第三步:

自定义Realm 

继承 AuthorizingRealm 

重写 AuthorizationInfo(授权) 

重写AuthenticationInfo(认证)

以下只是简单的测试

以下都是按照个人的设置和需要改变的。此刻数据是死的,运用的时候需要从数据库中得到

/**

* @author

zhouguanglin

* @date

2018/2/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();

       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中默认的过滤器

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

第五步:在spring-mvc.xml中配置权限的掌控 反常

<!-- 未认证或未授权时必须在springmvc里面配,spring-shiro里的shirofilter配不生效 -->    <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>

403是错误页面

第六步:在controller中测试运用的验证登入

@RequestMapping(value = "/login"

, method = RequestMethod.POST)

   public String login(String userName, String

passwd, Model model) {

       Subject subject = SecurityUtils.getSubject();

       UsernamePasswordToken token = new

UsernamePasswordToken(userName, passwd);

       try

{

subject.login(token);

       } catch

(UnknownAccountException e) {

           e.printStackTrace();

           model.addAttribute("userName", "用户名错误!"

);

           return "login"

;

       } catch

(IncorrectCredentialsException e) {

           e.printStackTrace();

           model.addAttribute("passwd", "秘码错误"

);

           return "login"

;

       }

       return "index"

;

   }

之后的都是HTML页面的

相关HTML中的有些shiro设置:

运用Shiro标签库前,首要需要在JSP引入shiro标签:

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

1、介绍Shiro的标签guest标签 :验证当前用户是不是为“访客”,即未认证(包括未记住)的用户。

<shiro:guest>Hi there!  lease <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a>

today!

</shiro:guest>

2、user标签 :认证经过或已记住的用户。

<shiro:user>Welcome back John!  Not John? Click <a href="login.jsp">here<a>

to login.

</shiro:user>

3、authenticated标签 :已认证经过的用户。不包括已记住的用户,这是与user标签的区别所在。

<shiro:authenticated><a href="updateAccount.jsp">Update your contact information</a>

.

</shiro:authenticated>

4、notAuthenticated标签 :未认证经过用户,与authenticated标签相对应。与guest标签的区别是,该标签包括已记住用户。 

<shiro:notAuthenticated>Please<a href="login.jsp">login</a>

in order to update your credit card information.

</shiro:notAuthenticated>

5、principal 标签 :输出当前用户信息,一般为登录帐号信息。  

Hello, <shiro:principal/>, how are you today?

6、hasRole标签 :验证当前用户是不是属于该角色。  

<shiro:hasRole name="administrator"><a href="admin.jsp">Administer the system</a></shiro:hasRole>

7、lacksRole标签 :与hasRole标签规律相反,当用户不属于该角色时验证经过。  

<shiro:lacksRole name="administrator"

>

Sorry, you are not allowed to administer the system

.

</shiro:lacksRole>

8、hasAnyRole标签 :验证当前用户是不是属于以下任意一个角色。   

<shiro:hasAnyRoles name="developer, project manager, administrator">

You are either a developer, project manager, or administrator.

</shiro:lacksRole>

9、hasPermission标签 :验证当前用户是不是持有指定权限。  

<shiro:hasPermission name="user:create"><a href="createUser.jsp">Create a new User</a></shiro:hasPermission>

十、lacksPermission标签 :与hasPermission标签规律相反,当前用户制定权限时,验证经过

<shiro:hasPermission name="user:create"><a href="createUser.jsp">Create a new User</a></shiro:hasPermission>

PS:倘若觉得我的分享不错,欢迎大众随手点赞、转发。

(完)

Java团长

专注于Java干货分享

扫描上方二维码获取更加多Java干货

回复

使用道具 举报

2991

主题

2万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99139312
发表于 2024-9-26 22:23:14 | 显示全部楼层
谢谢、感谢、感恩、辛苦了、有你真好等。
回复

使用道具 举报

2991

主题

2万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99139312
发表于 10 小时前 | 显示全部楼层
你的见解真是独到,让我受益匪浅。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-5 16:24 , Processed in 0.076984 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.