DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■32982 / inTopicNo.1)  ユーザーごとにフォームのコントロールの可視を切り替えたい
  
□投稿者/ TI 一般人(3回)-(2015/06/06(Sat) 20:53:33)
  • アイコン環境/言語:[VB.net] 
    分類:[.NET] 

    こんばんは。

    ユーザーごとにフォーム内のコントロールの可視を切り替えたいと思います。

    コントロールのTagに判定できるような何かを登録しておき、
    ログインフォームを作成し、そこで入力したユーザー名を保存しておき
    それぞれのフォームを読み込む際に、判定をしたいと考えています。

    しかし、ユーザー名をどのように保存をすれば、各フォームから参照できるのかが
    わかりません。

    ほかにも何か良い方法があれば、ご教授下さい。
    よろしくお願いします。

引用返信 削除キー/
■32983 / inTopicNo.2)  Re[1]: ユーザーごとにフォームのコントロールの可視を切り替えたい
□投稿者/ 魔界の仮面弁士 大御所(968回)-(2015/06/06(Sat) 21:20:55)
  • アイコンNo32982に返信(TIさんの記事)
    > ユーザーごとにフォーム内のコントロールの可視を切り替えたいと思います。

    この場合の「ユーザー」とは、何を指していますか?
    「Windows のログオンアカウント」とか、あるいは、
    「アプリケーション起動時に入力を求めるユーザーログイン情報」、
    それとも…?

    > コントロールのTagに判定できるような何かを登録しておき、
    ユーザー数はどの程度でしょう。
    また、それらのユーザーは固定的なのか、それとも
    運用中に利用者数が増減する物なのか否か。

    たとえば、ユーザー数が数種類の固定的なものなのであれば、ユーザー名を
    適当な文字(タブとかカンマとか改行とか)で区切りって Tag に放り込んでおき、
    実行時には、ユーザー名がその中に含まれているかどうかで可視判断するとか。

    一方、ユーザーが固定的では無く、メンバーの増減があるもののだとしたら、
    そのユーザーを管理するための情報がどこかにあるはずですよね。
    ActiveDirectory とかファイルとかデータベースとかに。
    その場合、ユーザーを識別するための ID となるものもそこにある筈なので、
    それを Tag に登録すれば良いのではないでしょうか。


    > しかし、ユーザー名をどのように保存をすれば、各フォームから参照できるのかが
    > わかりません。
    前提条件が曖昧すぎるので、具体的な回答はしにくいのですが、
    やりようはいろいろとあると思いますよ。
    別に Tag に拘らず、コントロールの可視情報を管理するための拡張プロバイダを
    設けるとか、あるいはフォーム上のコントロールの可視を、外部データベースなどで
    管理した上で、Load イベントあたりで表示を切り替えても良いでしょうし。
引用返信 削除キー/
■32984 / inTopicNo.3)  Re[2]: ユーザーごとにフォームのコントロールの可視を切り替えたい
□投稿者/ TI 一般人(4回)-(2015/06/07(Sun) 08:13:05)
  • アイコンNo32983に返信(魔界の仮面弁士さんの記事)
    ご回答ありがとうございます。

    ユーザーに関しては、Windowsのログインユーザーなどとは別に
    アプリケーション起動時に入力を求めるユーザーログイン情報を
    考えています。
    (コントロールの可視の切り替え以外にも、利用状況などのログも取れれば
     と考えています。)

    起動時に入力をしたユーザー名などを記憶しておき、各フォームのLoad時に
    コントロールの可視を切り替えたいのですが、どのように保存をしておけば
    良いかがわからない状況です。

    ネットワーク上で複数の同時利用を考えております。

    はじめはグローバル変数などを使えばよいかとも思いましたが、それでよいものか
    悩んでおります。

    拡張プロバイダというものも少し調べてみましたが、現状では私には
    難しいもののようです。もう少し調べてみたいと思います。

    よろしくお願いします。
引用返信 削除キー/
■32985 / inTopicNo.4)  Re[3]: ユーザーごとにフォームのコントロールの可視を切り替えたい
□投稿者/ Azulean 大御所(449回)-(2015/06/07(Sun) 16:45:15)
  • アイコンNo32984に返信(TIさんの記事)
    > 起動時に入力をしたユーザー名などを記憶しておき、各フォームのLoad時に
    > コントロールの可視を切り替えたいのですが、どのように保存をしておけば
    > 良いかがわからない状況です。

    各フォームのコンストラクタ(Sub New)やプロパティ、メソッドで情報を渡せば、後はそれをそのフォームで使えば良いだけという形にはできます。
    グローバル変数でもできますが、すべてのフォームをそのグローバル変数に依存させると、「この場合だけはこのようにしたい」みたいな特殊なパターンの作り込みや、フォームの再利用性が損なわれるというデメリットもあります。

    ユーザー名というよりは、そのユーザーはどういった人か、役割(ロール)ベースで考えた方が良さそうな気はしますが、やりたいこと一人一人違うのですか?


    > ネットワーク上で複数の同時利用を考えております。

    お互いのプロセスでそれぞれ影響しないのであれば、ネットワーク云々は関係なさそうですが、現状の情報とこの「ネットワーク上の複数の同時利用」という明記とをどの程度気にしないといけないか、予想がつきません。


    > (コントロールの可視の切り替え以外にも、利用状況などのログも取れれば
    >  と考えています。)

    ログの場所がネットワークフォルダーだとすると、そこそこ面倒くさいかもしれません。
    他のマシンのプロセスと同時にアクセスしたらどうなるのかなど。


    > 拡張プロバイダというものも少し調べてみましたが、現状では私には
    > 難しいもののようです。もう少し調べてみたいと思います。

    別に無理に背伸びする必要はないと思います。
    手堅いところで作れる自身をつけてから、拡張プロバイダーにするとどのようなメリットがあるのかを調べたり、試したりしていただければ。
引用返信 削除キー/
■32986 / inTopicNo.5)  Re[4]: ユーザーごとにフォームのコントロールの可視を切り替えたい
□投稿者/ TI 一般人(5回)-(2015/06/07(Sun) 20:37:40)
  • アイコンNo32985に返信(Azuleanさんの記事)

    ご回答ありがとうございます。

    > ユーザー名というよりは、そのユーザーはどういった人か、役割(ロール)ベースで考えた方が良さそうな気はしますが、やりたいこと一人一人違うのですか?
    >

    やりたいことは、部署、もしくは役職により帰る予定なので、おっしゃっている
    形が希望の形式です。

    >>ネットワーク上で複数の同時利用を考えております。
    >
    > お互いのプロセスでそれぞれ影響しないのであれば、ネットワーク云々は関係なさそうですが、現状の情報とこの「ネットワーク上の複数の同時利用」という明記とをどの程度気にしないといけないか、予想がつきません。
    >

    この点がよくわかっていないのですが、ClickOnceを利用して、アプリケーションを
    配布し、DBはネットワーク上に配置する予定です。
    この場合は、グローバル変数でも問題ないのでしょうか。
    また、グローバル変数以外にアプリケーション内で共通の情報を保存する方法が
    あるのでしょうか。


    > ログの場所がネットワークフォルダーだとすると、そこそこ面倒くさいかもしれません。
    > 他のマシンのプロセスと同時にアクセスしたらどうなるのかなど。
    >

    この点に関しては、私の説明が悪かったです。
    DBに使用開始と終了を保存するテーブルを作成しようかと考えています。

    よろしく御願い申し上げます。
引用返信 削除キー/
■32987 / inTopicNo.6)  Re[5]: ユーザーごとにフォームのコントロールの可視を切り替えたい
□投稿者/ Azulean 大御所(450回)-(2015/06/07(Sun) 21:03:43)
  • アイコン2015/06/07(Sun) 21:06:57 編集(投稿者)

    No32986に返信(TIさんの記事)
    > やりたいことは、部署、もしくは役職により帰る予定なので、おっしゃっている
    > 形が希望の形式です。

    であれば、ロールを何らかの形で定義して、コントロールの Tag プロパティにうまく設定を放り込めば良いと思います。


    > この点がよくわかっていないのですが、ClickOnceを利用して、アプリケーションを
    > 配布し、DBはネットワーク上に配置する予定です。
    > この場合は、グローバル変数でも問題ないのでしょうか。
    > また、グローバル変数以外にアプリケーション内で共通の情報を保存する方法が
    > あるのでしょうか。

    失礼なことを確認するようで申し訳ないですが、グローバル変数はあくまで1つのマシンの1つのプロセス内にしか効きませんが、この点は理解されていますか?
    どんなユーザーがいて、どんなロールを持っているかは、1つのマシンに置いていては意味がありませんので、ネットワーク上で管理・保有する仕組みが必要です。
    また、そういった情報を格納している DB を各マシンから直接見えるようにしてしまうと、どんなユーザーがいてパスワードが何かが見えてしまうでしょうから、DB を直接晒すのではなく、認証などを担うサーバーを用意しなとダメでしょうね。
    いわゆる、クライアントサーバーの仕組みで、認証をサーバーに任せる感じでしょうか。
    そういったシステムを設計し、サーバーとプログラムを用意し、クライアントとなる今回のアプリケーションでサーバーと通信するといったことが必要になってくるのでしょう。


    ところで、このやりとりを見ていて、質問内容があまりにも広くなっていると感じます。
    局所的な実装方法に絞った質問であるとか、抽象的にアプローチの方向性だけに絞った質問であればやれることはありますが、抽象的な層から具体的な実装まで求めているように見えて、Web ベースで詰めるのは難しいと言いますか、なにか間違っている気がしてならないです。
引用返信 削除キー/
■32988 / inTopicNo.7)  Re[6]: ユーザーごとにフォームのコントロールの可視を切り替えたい
□投稿者/ TI 一般人(6回)-(2015/06/08(Mon) 08:14:44)
  • アイコンNo32987に返信(Azuleanさんの記事)
    ご回答ありがとうございます。

    > であれば、ロールを何らかの形で定義して、コントロールの Tag プロパティにうまく設定を放り込めば良いと思います。
    >
    現状の問題点は、この点をどのようにすればよいかということです。
    グローバル変数で問題がなければ、まずはそれで進めてしまうのですが、
    何かほかに良い方法がないかと思い、質問させていただいた次第です。


    見られて問題のあるデータではないので、すべてを見られるようにしてもよいのですが、
    データのご入力だとか、誤って削除してしまう問題を回避するために、使用者に
    より、開くことができるフォーム等を変更できればと考えていました。

    私の知識不足で申し訳ないのですが、現在、DBはSQLServer2008Expressを使用
    しているのですが、Management Studioさえなければ簡単にはデータをみることが
    出来ないと思っているのですが、間違っていますでしょうか。
    (現在の私の知識では、このあたりの管理までは手が回っておりません。
     何か良い参考書、サイトなどがあれば、教えていただけると大変ありがたく
     思います。)

    グローバル変数について、おっしゃっている点については理解をしているつもりです。
引用返信 削除キー/
■32991 / inTopicNo.8)  Re[7]: ユーザーごとにフォームのコントロールの可視を切り替えたい
□投稿者/ 魔界の仮面弁士 大御所(971回)-(2015/06/08(Mon) 11:39:07)
  • アイコンNo32988に返信(TIさんの記事)
    > グローバル変数で問題がなければ、まずはそれで進めてしまうのですが、
    > 何かほかに良い方法がないかと思い、質問させていただいた次第です。

    そのグローバル変数には、何が保持されるのでしょうか?
    そのグローバル変数は、実行時に変更されることがあるのでしょうか?



    >> であれば、ロールを何らかの形で定義して、コントロールの Tag プロパティにうまく設定を放り込めば良いと思います。
    > 現状の問題点は、この点をどのようにすればよいかということです。

    それはお好きなように決めてしまってよいと思いますよ。
    その上で、「この方法を思いついたのですがどう思いますか?」という相談でも良いでしょうし。
    要件に応じてどうとでも。

    そもそも、ロールの考え方も様々なわけで。

    (A) ロールの総数は固定的なのか、後から追加できるのか?

    (B)「許可されたものだけを表示する」のか、「拒否されたものだけを隠す」のか、あるいはその両方か。

    (C)ユーザーアカウントとロールの関係は、一対多なのか、それとも多対多なのか。
     (一人のユーザーが同時に複数のロールを持てるのか、それとも単一のロールを持つのか)



    以下、思いつきで:


    ==========================================================================
    【例1】「A:固定、B:許可されたものをVisible=Trueに変更、C:単一ロール」
    --------------------------------------------------------------------------
    ・ロールは「管理者、パワーユーザー、制限ユーザー、監査者」の4種。
      'ログイン時に、1/2/3/4 いずれかに相当する列挙値を取得する
      Dim currentRole As YourAppRole '<Flags>属性なし

    ・表示するかどうかを「1」「0」の2文字で表し、それをロールの数(4つ)繋げて表現しておく。
      TextBox1.Tag = "1001" '→ 管理者と監査者のみ Vislbe=Trueに変更したい
      Button1.Tag = "1100" '→ 管理者とパワーユーザーのみ Vislbe=Trueに変更したい

    ・Load 時に、上記の情報を元に表示の可否を調整する

     For Each ctrl As Control In 対象コントロール
      Dim sRole As String = TryCast(ctrl.Tag, String)
      If currentRole = YourAppRole.None OrElse Len(sRole) <> 4 Then
       ctrl.Visible = False
      Else
       ctrl.Visible = sRole(currentRole - 1).Equals("1"c)
      End If
     Next

    ==========================================================================
    【例2】「A:可変、B:許可と拒否の両方、C:多対多」
    --------------------------------------------------------------------------
    ・権限情報は、SQL Server のテーブルで管理されている。
      'ロールテーブル
      ' 権限ID int NOT NULL
      ' 機能ID NVARCHAR2(32) NOT NULL
      ' 利用可 BIT NOT NULL
      Dim tblRole As DataTable = GetRoleFromServer(…)

    ・コントロールごとに機能IDが振られており、それをTagに文字列で保持している。
      Button1.Tag = "社員マスター.表示ボタン"
      Button2.Tag = "社員マスター.保存ボタン"
      Button3.Tag = "社員マスター.印刷ボタン"

    ・Load 時に、上記の情報を元に表示の可否を調整する

     Dim q1 = From row In tblRole
       Where row.Field(Of Integer)("権限ID") = roleId
       Select ID = row.Field(Of String)("機能ID"),
         Vibile = row.Field(Of Boolean)("利用可")
     For Each ctrl In 対象コントロール
      Dim ctrlID As String = TryCast(ctrl.Tag, String)
      If ctrlID IsNot Nothing Then
       Dim q2 = From row In q1 Where row.ID = ctrlID Order By row.Visible
       If q2.Any() Then
        If Not q2.First().Vibile Then
         ctrl.Visible = False '拒否ロールが最優先
        Else
         ctrl.Visible = q2.Last().Vibile
        End If
       Else
        '拒否も許可もしないので Visible はデザイン時のまま
       End If
      End If
     Next

    毎回 Linq 検索するのではなく、Dictionary 等で管理しておいても良いかな。
引用返信 削除キー/
■32992 / inTopicNo.9)  Re[7]: ユーザーごとにフォームのコントロールの可視を切り替えたい
□投稿者/ Azulean 大御所(451回)-(2015/06/08(Mon) 22:31:00)
  • アイコン2015/06/09(Tue) 07:06:17 編集(投稿者)

    No32988に返信(TIさんの記事)
    > 現状の問題点は、この点をどのようにすればよいかということです。
    > グローバル変数で問題がなければ、まずはそれで進めてしまうのですが、
    > 何かほかに良い方法がないかと思い、質問させていただいた次第です。

    No32985 にも書いたとおりです。
    基本的には引数やプロパティを活用するか、妥協してグローバル変数にするかです。
    (前提:ここで引き渡したい情報は、ログインしたユーザーの情報、主にロールを伝搬する目的だと捉えた上でのコメントです)


    > 私の知識不足で申し訳ないのですが、現在、DBはSQLServer2008Expressを使用
    > しているのですが、Management Studioさえなければ簡単にはデータをみることが
    > 出来ないと思っているのですが、間違っていますでしょうか。

    間違っていると考えています。
    そのソフトはかんたんに入手可能であるし、アプリを作る技能を持つ人がいれば何とでもできます。
    要するに、アプリに DB の接続情報を埋め込み、それを元に認証する、あるいは記録するということができる以上は、悪意ある操作が行われるリスクがあると考えるべきです。
    ただ、そのリスクがどの程度の被害を与えうるのかは、あなた自身でリスクを評価してください。
    取るに足らないリスクであれば、対策は不要でしょうし、逆に会社の存続に影響するぐらいのリスクがあるのであれば、プロに任せるべきでしょう。


    スレッドに書かれている情報を見る限り、「見られて困るデータではない」「誤入力を防ぎたい」というだけであれば、ここまで危惧することではないのかもしれません。
    たとえば、平職員が、社長権限と同じような閲覧・入力をされても、被害がまったくないのであれば、極端な話、ノーケアで良いと思います。
    ただ、その場合、ログは信頼できないと考えるべきですね。他者の権限を悪用された場合、ログ自体にはその奪取された権限で操作したように記録されるので、特定できないことになります。
    (会社の資産を扱うようなシステムだと明らかに問題ありますが…、そういった話ではないと思っています)


    おすすめ文献に関しては申し訳ありませんが、心当たりはありません。
    独学に近いところがあるので、筋道立てた良いものというものを紹介できる状況にないためです。


    実装に関してはいかようにも方法があるので、要求のサンプルがないと具体的な提案にならないかもです。
    Tag にロールの Enum をカンマ区切りで入れるとか、2 進数で扱うとか、いくつか方法はあるでしょうね。
引用返信 削除キー/
■33063 / inTopicNo.10)  Re[8]: ユーザーごとにフォームのコントロールの可視を切り替えたい
□投稿者/ TI 一般人(7回)-(2015/08/01(Sat) 07:31:15)
  • アイコンご回答が遅くなり、大変申し訳ありませんでした。

    本業が忙しく、なかなか着手できない状況出来た。

    いろいろと問題はあるかと思いますが、まずはグローバル変数と
    tagを利用して、試していきたいと思います。

    その過程で、分からないことができたら、再度質問をさせていただきます。

    ありがとうございました。
解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -