史郎権管理における統合と使用SpringBoot - 単純なプロジェクトで

説明:シンプルなプロジェクトと本稿では四郎の使用を説明するために、最後のプロジェクトは、ダウンロードの参考のため添付githubのに対処します。

史郎さんのプロフィール

史郎は、軽量のセキュリティフレームワークは、ユーザ認証とユーザー認証を含んでいます

史郎の機能:

認証(認証):ユーザの識別は、一般に、ユーザ「ログイン」と呼ばれる
アクセス制御:承認(認可)。例えば、ユーザが操作を使用する許可を持っている場合。
セッション管理(セッション管理):でも非EJBまたはWebアプリケーションにおけるユーザー固有のセッション管理、。
暗号化(暗号化):使いやすさを確保するために、データソースを暗号化する暗号化アルゴリズムを使用している間。
アプリケーションのセキュリティの4個の礎石の開発チームのシロフレームワークと呼ばれる以上の4点を、。

史郎アーキテクチャのコアAPI:

件名:ユーザープリンシパル(セキュリティマネージャへの操作)
のSecurityManagerセキュリティマネージャは、(すべての被験者の管理は、セキュリティマネージャは傘を形成するために一緒に内部安全コンポーネントと、四郎コアアーキテクチャである。)
Reaml:ブリッジは、自然界にはデータ接続四郎です特定のセキュリティは、データ・ソース接続の詳細をカプセル化DAOは、シロに関連する必要なデータを取得します。これは、データベース、クエリログイン、パスワード、権限などを動作させることです

史郎の設定クラス:

ShiroFilterFactoryBeanを作成し、(ブロックされている必要はありませんインターセプトに配置されるようにパスを必要史郎インターセプタは、)
DefaultWebSecurityManagerを作成し、(レルムを設定するための)
Reaml(AuthorizingReamlを継承)を作成しました。

史郎は、内蔵のフィルタは、関係当局のインターセプタを達成することができます:

共通のフィルタ:
安野:いいえ認証(ログイン)缶アクセス
authcは:アクセスの認証を取得しなければならない
ユーザーを:あなたはリメンバー・ミー機能を使用している場合は、直接アクセスすることはできない
パーマを:リソースはリソースでなければなりませんがアクセスできる
役割を:リソースがアクセスする役割の権限である必要があります

史郎使用:

:史郎を使用する場合は、まずどのような私たちの手順を決定する必要があります
。1. [追加]史郎依存関係
; 2.領域は、そのクラス(継承AuthorizingRealmによってクラス)を達成
3.史郎実装された構成クラス
4実施ログインインターフェースのフロントエンドをそしてコントローラクラスの作成

最初のステップ:のpom.xmlに追加の依存関係

 <!--添加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>

ステップ2:カスタムクラスを作成しますMYREALM

私たちは、カスタムクラスMYREALM継承AuthorizingRealm書き換えdoGetAuthenticationInfoとdoGetAuthorizationInfoメソッドを作成する必要があります。ユーザーを認証するために使用されDoGetAuthenticationInfoは、doGetAuthorizationInfoは、ユーザーがそのようなリンク、リソースファイルにアクセスすると、この操作を行うことが許可されていることを証明するために、操作するユーザーの権限のアクセス制御を承認しました。

/**
 * 自定义Realm
 *
 */
public class MyRealm extends AuthorizingRealm {
	@Autowired
	private UserService userService;
	@Autowired
	private RoleMenuMapper roleMenuMapper;
	@Autowired
	private MenuMapper menuMapper;
	@Autowired
	private RoleMapper roleMapper;

	/**
	 * 授权--验证url
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		//获取当前登录的用户名
		String name = (String) SecurityUtils.getSubject().getPrincipal();
		// 有了用户就可以拿到对应的角色,有角色就可以拿到对应的菜单
		User user = userService.findByName(name);
		// 这个角色对应 的菜单,先用roleId查找角色和菜单的关联表,再用关联表中的menuId查找对应的menu对象,
		// 再.getPermissions找出权限名
		List<RoleMenu> roleMenuList = roleMenuMapper.findByRoleId(user.getRoleId());//查出所有角色关联的菜单
		SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
		for (RoleMenu roleMenu : roleMenuList) {
			info.addStringPermission(menuMapper.findById(roleMenu.getMenuId()).getPermissions());// 添加权限
		}
		// 设置角色
		Set<String> roles = new HashSet<String>();
		roles.add(roleMapper.findById(user.getRoleId()).getName());
		info.setRoles(roles);
		return info;
	}
	/**
	 * 权限认证--登录
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		String name = (String) token.getPrincipal();// 拿到的是用户名 就是UsernamePasswordTokenr的第一个参数 name
		User user = userService.findByName(name);// 根据name找到数据库中的user实体
		if (user != null) {// 这里的一步主要是来判断密码是否正确
			/**
			 * 对于传的三个参数
			 * Object principal:可以传username或者user对象都可以
			 * Object credentials:用户密码:注意这里是指从数据库中获取的password
			 * String realmName:即当前realm的名称(个人尝试:随便传个字符串就行,但不能为null,具体不太明白)
			 */
			return new SimpleAuthenticationInfo(user.getName(), user.getPwd(), "MyRealm");
		} else {
			return null;
		}
	}
}

ステップ3:史郎の設定クラスを作成します。

@Configuration
public class ShiroConfig {
    @Bean
    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //必须设置设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        //设置没有登录时跳转的页面
        //如果不设置默认会自动寻找web工程根目录下的"/login.jsp"页面
        shiroFilterFactoryBean.setLoginUrl("/login");
         /**
         * 登录成功后要跳转的链接
         * 一般shiro验证成功后,我们需要执行一些操作,比如:缓存用户信息到session,返回页面一些信息等操作
         * 所以,不需要shiro来跳转
         */
        //shiroFilterFactoryBean.setSuccessUrl("/index");
       
         /**
         * 添加拦截器:
         * 常用内置过滤器
         *  anon:无需认证(登录)用户可以直接访问(就相当于游客)
         *  authc:必须要认证才能访问
         *  user:使用了remenberMe的功能的用户可以直接无需登录访问(相当于记住登录状态)
         *  perms:必须获取资源权限才能访问
         *  role:必须获取角色授权才能访问
         *  logout:用户登出,这里不用设置控制器,退出后直接跳转到/
         */
        Map<String,String> filterMap = new LinkedHashMap<String,String>();
        //配置不会被拦截的链接 顺序判断 anon:所有的url都可以匿名访问
        filterMap.put("/static/**","anon");
        filterMap.put("/user/login","anon");
        //配置退出过滤器,其中具体的实现shiro已经替我们实现了
        filterMap.put("/logout", "logout");
        //authc:所有url需要认证才能访问
        filterMap.put("/admin/**", "authc");
        filterMap.put("/houtai/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        return shiroFilterFactoryBean;
    }

    /**
     * 创建 安全管理器 SecurityManager
     * @return
     */
    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //设置realm
        securityManager.setRealm(myRealm());
       return securityManager;
   }
    /**
     * 身份认证realm;(这个需要自己写,账号密码校验,权限等)
     * @return
     */

    @Bean
    public MyRealm myRealm(){
        return new MyRealm();
    }
    
    /**
     * shiro生命周期处理器
     * @return
     */
    @Bean
    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
    	return new LifecycleBeanPostProcessor();
    }
    
    /**
     * 开启shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助springAOP扫描使用
     * shiro注解的类,并在必要时进行安全逻辑验证
     * 配置以下两个bean即可实现此功能
     * @return
     */
    
    @Bean
    @DependsOn({"lifecycleBeanPostProcessor"})
    public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
    	DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
    	advisorAutoProxyCreator.setProxyTargetClass(true);
    	return advisorAutoProxyCreator;
    }
    
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {
    	AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
    	authorizationAttributeSourceAdvisor.setSecurityManager(securityManager());
    	return authorizationAttributeSourceAdvisor;
    }
    /**
     * 配置 ShiroDialect 用于thymeleaf 和shiro标签配合使用
     * @return
     */
    @Bean
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }
}

ステップ4:フロントエンドのログイン画面を実装し、コントローラクラスを記述します。

プロジェクトだったもののようなインタフェースは、持っているので、注釈はありませんここにショーで、また、より包括的です。

プロジェクト住所:https://github.com/isczy/BookSystem.git

ここに画像を挿入説明

史郎実装プロセス

1.プロジェクトを開始し、それはコンフィギュレーションクラスShiroConfigをロードします

2.ユーザー名とパスワードを入力し、持ってログインをクリックしてsubject.login(token);操作を、それが自動的に必須SecurityUtils.setSecurityManager()の設定を呼び出す前に、セキュリティマネージャに委託します

実際の認証ロジックを担当する3.SecurityManager;認証を認証するために委託されます

4.Authenticatorはノーリターン/例外が失敗した認証によってスローされていないが存在する場合、レルムは、本人確認情報を取得し、適切なトークンの着信レルムを置きます。ここでは、複数のレルムを設定することができ、対応する順序や戦略にアクセスされます。

5. doGetAuthenticationInfoレルムを行う方法は、認証用のカスタム、ユーザー名とパスワードを書き換えます。終了し通常の実行に戻り、それは検証が成功であることを示しています。それ以外の場合は例外:UnknownAccountException:パスワードエラー:ユーザ名ではない/ IncorrectCredentialsExceptionのが存在します

場合は、アドレス4. Accessプロジェクト、ユーザーが権限を持っているかどうかを確認するために、URLを確認するために認可され、書き換えられたカスタムレルムにdoGetAuthorizationInfoメソッドを実行します

史郎認証プロセスマップ

ここに画像を挿入説明

史郎承認プロセスマップ

ここに画像を挿入説明
最後に、記事のプロジェクトアドレスの末尾を添付:

https://github.com/isczy/BookSystem.git
公開された12元の記事 ウォン称賛22 ビュー2602

おすすめ

転載: blog.csdn.net/weixin_45240169/article/details/104036314